##はじめに
思いつく限りシェル(コマンド)で使える技を並べていきます。補完の方よろしくお願いします。
##空白を削除する
$ tr -d ' '
##出力結果を表示しないようにする
$ echo test > /dev/null 2>&1
##改行も含め出力する
$ cat << EOF
a
b
c
EOF
ちなみに、出力結果は、以下のようにして保存できます。
$ cat << EOF > ~/hoge.txt
a
b
c
EOF
##bashで現在地のパスを取得する
$ dir=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd)
##zshで現在地のパスを取得する
$ dir=${0:a:h}
##変数のクォーテーションなどを取り除く
$ com=test
$ com="eval echo '$'$com"
##curlで連続保存する
$ curl -O https://hoge.txt -O https://huga.txt
##curlをサイレントにする
$ curl -s -O https:/hoge.html
##sedで連続置換する
$ sed -e 's/hoge/huga/g' -e 's/huga/hugahuga/g'
##sedで上書き保存する
$ sed -i "" -e "s/hoge/huga/g" test.txt
-i
はバックアップを作ります。作りたくないので、null
にしています。
通常なら-ie
でいけたと思っていたのですが、Macでは上手く行かなかったような気がします。
##jqで括弧を取り除く
$ echo {"hoge":"huga"} | jq -r .
##改行をスペースに変換する
$ perl -p -e 's/\n/ /g'
##出力しない一括設定
#!/bin/zsh
exec > /dev/null 2>&1
ls -a .
pwd
##区切りを設定し、値を取得する
$ echo ho,ge,hu,ga | cut -d ',' -f 3
この場合、hu
が取得されます。
##行末の改行コードを削除する
$ ruby -0777 -ne 'print $_.chomp("")'
##パス内から優先順位が高いものを実行する
#!/usr/bin/env ruby
env
がそうです。
##指定した行を抜き出す
cat test.txt | awk 'NR==3'
test.txt
の3
行目を抜き出します。
##引数によって処理を変える
#!/bin/zsh
if (( ${#*} == 2 )); then
echo $1 $2
else
echo no
f
$2
です。
##ファイルの有無によって処理を変える
#!/bin/zsh
sc="../script"
if [ -e $sc/path.sh ];then
echo ok
else
echo no
fi
-e
です。
##結果によって処理を変える
#!/bin/zsh
if ls ~/test.txt;then
echo ok...test.txt
else
echo no...test.txt
fi
または、以下の様な書き方もできます。
if [ $# == 0 ]; then
if [ $# -eq 0 ]; then
##何もしないコマンド
:
##タイムスタンプの変更
touch *
##以外の文字を検索する
$ echo "test ok hoge huga" | grep -v -e zsh
##一致した行の上下を含める
$ grep -a -B 25 -A 100
-A
が下で-B
が上です。
##重複していないものを抜き出す
$ sort test.txt | uniq -u
##キーの入力待機
#!/bin/zsh
echo enter!
read key
##前のコマンドの引数以外を抜き出す
$ !:-
##前のコマンドの引数を実行する
$ !$
##前のコマンドの引数ヘッダを抜き出す
$ !$:t
##xargsを任意の位置に置く
find . -name "*.rb" -type f | xargs -I {} echo Hello, {} !
##追記
###出力しないようにする
$ echo test &>/dev/null