読者です 読者をやめる 読者になる 読者になる

set setting reset

インフラ関連の小ネタと備忘録

bash でよく使うやつ

bash

桁指定で表示する

-bash ~$ i=1
-bash ~$ printf "%02d" $i
01-bash ~$

改行させるなら

-bash ~$  printf "%02d\n" $i
01

整数の加算

expr とさらばできる

-bash ~$  i=0
-bash ~$  ((i++))
-bash ~$  echo $i
1

C 言語っぽい for 文がかける

$  for (( i=0; i<3; i++)) do echo $i; done
0
1
2

正規表現でマッチングできる

in 句のように使える

-bash ~$  a=abc
-bash ~$  [[ $a =~ c ]] && echo "matched"
matched
-bash ~$  [[ $a =~ d ]] && echo "matched"
-bash ~$

リスト

# リストの作成
-bash ~$  i=("a" "b" "c")

# リストの展開
-bash ~$  echo ${i[0]}
a
-bash ~$  echo ${i[1]}
b
-bash ~$  echo ${i[2]}
c
-bash ~$  echo ${i[@]}
a b c
-bash ~$  echo ${i[*]}
a b c

# 要素の数
-bash ~$  echo ${#i[@]}
3

# 要素の追加
-bash ~$  i+=("d")
-bash ~$  echo ${i[@]}
a b c d
-bash ~$  echo ${#i[@]}
4

引数を順番に処理する

$  cat shift_test.sh
#!/bin/bash

echo $1
echo $#
shift 
echo $1
echo $#

$  sh shift_test.sh 1 2
1
2
2
1

引数がなくなるまでループする

$  cat shift_test.sh
#!/bin/bash

for (( i=0; $#>0; ))
do
    echo $1
    shift
done

echo "exit" && exit 0

$  sh shift_test.sh 1 2 3 4 5
1
2
3
4
5
exit

i=0 がないと shift_test.sh: line 3: syntax error: arithmetic expression required と怒られる

ユーザからの入力があるまでスクリプト実行を待機する

$  cat shift_test.sh
#!/bin/bash

for (( i=0; $#>0; ))
do
    echo $1
    shift
    if [ $# = 1 ]; then
        read -p "this is last loop. hit enter key to continue."
    fi
done

echo "exit" && exit 0

$  sh shift_test.sh  1 2 3 4 5
1
2
3
4
this is last loop. hit enter key to continue.
5
exit

中断するときは ctrl + c

関数名を表示する

$  cat func_test.sh
#!/bin/bash


function mytest()
{
    echo ${FUNCNAME}
}

mytest

$  sh func_test.sh
mytest

printf で文字列を置換する

$ a=test
$ printf '%s\n' $a
test

ファイルの行番号を表示する

以下の様な txt を用意して、

$  cat raw.txt
nikko nikko ni-
anata no heart ni
niko niko ni-
egao todokeru
yazawa niko niko-
nikoni- tte yonde
love niko

while ループでまわす

$ cat raw.txt | while read line; do printf '%2d %s\n' ${lineno} "${line}"; (( lineno++ )) ; done
 1 nikko nikko ni-
 2 anata no heart ni
 3 niko niko ni-
 4 egao todokeru
 5 yazawa niko niko-
 6 nikoni- tte yonde
 7 love niko

実行中のファイルの行番号を表示する

$  cat raw.sh
#!/bin/bash

echo ${LINENO}
echo ${LINENO}
echo ${LINENO}
echo ${LINENO}

function mytest()
{
    echo ${FUNCNAME} ${LINENO}
}

echo ${LINENO}
echo ${LINENO}

mytest

echo ${LINENO}
echo ${LINENO}

$  sh raw.sh
3
4
5
6
13
14
mytest 10
18
19