Bash札記(一)


1、変数の拡張操作:
${varname:-word}変数が空でない場合は、その値を返します.そうでない場合は、デフォルトのwordを返します.
filename=${1:-/dev/tty}で、位置パラメータが空の場合は/dev/ttyを返します.
${varname:=word}変数が空でない場合は、その値を返します.そうでない場合は、wordに値を割り当て、その値を返します.
${varname:?message}変数が空でない場合は値を返します.そうでない場合はvarname:messageを印刷し、
コマンドまたはスクリプトを終了
${varname:+word}varnameが存在し、空でない場合はwordを返します.そうでない場合はnullを返します.
変数が$(count:+1}存在するかどうかをテストするために使用できます.
2、モードマッチング操作:
例えば、path=/home/tolstoy/mem/long.file.name
${variable#pattern}patternマッチング変数が開始された場合、最短マッチングを削除し、残りの部分を返します.
${path#/*/}はtolstoy/mem/longを返します.file.name
${variable##pattern}patternマッチング変数が開始された場合、最長マッチングを削除し、残りの部分を返します.
${path##/*/long.file.nameを返します
${variable%pattern、patternマッチング変数が終了した場合、最短マッチングを削除し、残りの部分を返します.
${path%.*}は/home/tolstoy/mem/longを返します.file
${variable%%pattern}patternマッチング変数が終了した場合、最長マッチングを削除し、残りの部分を返します.
${pattern%%%.*}戻り/home/tolstoy/mem/long
文字列の長さを返します.
x=supercalifragilisticexpialidocious
echo ${#x}
3、特殊変数:
#パラメータを表す個数
@コマンドラインパラメータ、$@は元の個別の複数のパラメータに拡張され、元のパラメータを別の関数に渡すには$@を使用します.
*コマンドラインパラメータ、$*を1つのパラメータに拡張
? 前のコマンドの終了ステータス
$shellプロセスのid
0 shellプロセスの名前
! 最後のバックグラウンドでコマンドを実行するプロセスidは、wait操作のためにプロセスidを保存するために使用できます.
IFS内部テキストフィールドの分割は、通常スペース、tabまたは改行である
PS 1メインコマンドラインプロンプト、デフォルトは$
PS 2行継続のプロンプト、デフォルトは>
PS 4はset-xプロンプトを使用し、デフォルトは+
PWD現在の作業ディレクトリ
4、終了状態のif-else-fiを使用する

if grep "abc" file > /dev/null 
then
    echo "find abc in file"
else
    echo "not find abc in file"
fi

実行に成功したexitステータスが0の場合ifを実行し、そうでない場合elseを実行します.
使用可能&

grep "abc" file >/dev/null &{
  echo "find abc in file"
}

5、break、continueは数値パラメータを持って退出層数を表すことができる

while condition1                 Outer loop
do  ...
    while condition2             Inner loop
    do  ...
        break 2                  Break out of outer loop
    done
done

6、sed
1)複数の置換を実行

 sed 's;/home/tolstoy/;/home/lt/;'

sの後に分割を指定できます.
例:

sed 's/\/usr\/local\/bin/\/common\/bin/' <old >new

|分割を指定することで、上のコマンドをよりきれいにすることができます.

sed 's|/usr/local/bin|/common/bin|' <old >new

2)使用&
単語の両側に括弧を付けたいのですが

    echo "hello 123" | sed 's/[a-z]*/(&)/' <old >new

複数回使用可能

    echo "hello 123" | sed 's/[a-z]*/(&)(&)/' <old >new

3)行数で範囲を指定する:

sed '1,100 s/A/a/'
sed '100,$ s/A/a/'

4)dで削除

sed -e 's/#.*//' -e '/^$/ d' 

上のコードは、空の行とコメントを削除するために使用されます.
5)pを用いてgrepに達する機能

sed -n '/pattern/ p' # 
sed -n '/pattern/ !p' </tmp/b # 

6){}を使用して複数のアクションをグループ化します.
begin、end間の空白行とコメントを削除します.

sed -n '
	/begin/,/end/ {
	     s/#.*//
	     s/[ ^I]*$//
	     /^$/ d
	     p
	}
'

7)wを使用してファイルを書き込む
たとえば、ファイルfileの偶数を見つけてevenファイルに配置します.

sed -n 's/^[0-9]*[02468] /&/w even' <file 

sedリファレンスhttp://www.grymoire.com/Unix/Sed.html