やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

bashのメタ文字・予約語・コメント・エスケープシーケンス

 使用例を添えて。

成果物

情報源

man bash

メタ文字

種類 和名 概要
blank 空白文字 <space>, <tab>
word(token) 単語 シェルが1単位とみなす文字列。
name(identifire) 名前(識別子) 英数字と_で構成されたもの(最初の字は英字か_
meta-character メタ文字 クォートされていない場合に単語区切りとなる文字。|, &, ;, (, ), <, >, <space>, <tab>
control-operator 制御演算子 制御機能を持つトークン。||, &, &&, ;, ;;, (, ), |, |&, <newline>

予約語

 !, case, do, done, elif, else, esac, fi, for, function, if, in, select, then, until, while, {, }, time, [[, ]]

コメント

 行頭に#を付与する。

# コメント

エスケープシーケンス

意味
\ 改行エスケープ(行末にあるとき)
\a 警告 (ベル)
\b バックスペース
\e エスケープ文字 ANSI escape code
\E エスケープ文字 ANSI escape code
\f フォームフィード
\n 改行
\r 復帰 (carriage return)
\t 水平タブ
\v 垂直タブ
\\ バックスラッシュ
\' シングルクォート
\" ダブルクォート
\nnn 8 進値が nnn である 8 ビット文字 (1 文字につき数字 1〜3 桁)
\xHH 16 進値が HH である 8 ビット文字 (16 進で 1〜2 桁)。
\uHHHH 16 進値が HHHH であるユニコード (ISO/IEC 10646) 文字 (16 進 1〜4 桁)。
\UHHHHHHHH 16 進値が HHHHHHHH であるユニコード (ISO/IEC 10646) 文字 (16 進 1〜8 桁)。
\cx control-x の文字(例: \cdCtrl+D

 エスケープシーケンスを解釈して出力する。

echo -e 'A\tB\n1\t2'

 クォートをエスケープする例。

echo "I'm Andy."
echo 'I'\''m Andy.'
URL='https://example.com'
echo "<a href=\"${URL}\"></a>"
echo '<a href="'"${URL}"'"></a>'

使用例

echo 'A'
echo 'B'
echo 'A'; echo 'B';
echo 'A';   echo 'B';
echo 'A' && echo 'B';
echo 'A' & echo 'B';
{ echo 'A'; sleep 2; } & echo 'B';
(echo 'A'; echo 'B')
{ echo 'A'; echo 'B'; }
(echo 'A' && echo 'B')
{ echo 'A' && echo 'B'; }
[ 1 -eq 1 ] && echo 'TRUE' || echo 'FALSE';
[ ! 1 -eq 1 ] && echo 'TRUE' || echo 'FALSE';
[ 1 -eq 1 -a 1 -eq 2 ] && echo 'TRUE' || echo 'FALSE';
[ 1 -eq 1 -o 1 -eq 2 ] && echo 'TRUE' || echo 'FALSE';
[ 'A' = 'A' ] && echo 'TRUE' || echo 'FALSE';
[[ A = A ]] && echo 'TRUE' || echo 'FALSE';
[[ A = A && B = C ]] && echo 'TRUE' || echo 'FALSE';
[[ A = A || B = C ]] && echo 'TRUE' || echo 'FALSE';
_NAME1='N'; echo "$_NAME1";
NAME='N'; echo '$NAME'; echo "$NAME";
echo -e 'A\nB' | grep 'B'
{ echo Out; echo Err >&2; } |& cat
echo A > a.txt
echo A >| a.txt
cat < a.txt
NAME=A; case $NAME in A) echo 'NAME is A.';; B) echo 'NAME is B.';; *) echo 'Another...';; esac
NAME=A
case $NAME in
A) echo 'NAME is A.';;
B) echo 'NAME is B.';;
*) echo 'Another...';;
esac
while [ 1 -eq 1 ]; do echo 'while!'; break; done;
until [ ! 1 -eq 1 ]; do echo 'while!'; break; done;
if [ 1 -eq 1 ]; then echo '1=1'; fi
if [ 1 -ne 1 ]; then echo '1=1'; else echo '1!=1'; fi
if [ 1 -eq 2 ]; then echo 'if'; elif [ 1 -eq 1 ]; then echo 'elif'; else echo 'else'; fi
for ((i=0; i<5; i++)); do echo 'i='"$i"; done;
for i in {a..g}; do echo 'i='"$i"; done;
select selected in {AA,BB}; do echo 'select is '"$selected"'.' && break; done;
select selected in {AA,BB}; do case $selected in AA|BB) echo 'select is '"$selected"'.' && break;; esac; done;
select selected in {AA,BB}; do case $selected in AA|BB) echo 'select is '"$selected"'.' && break;; \*) continue;; esac; done;   
time sleep 2
function MyFunc() { echo F; }
MyFunc() { echo F; }
MyFunc

対象環境

  • Raspbierry pi 3 Model B+
  • Raspbian stretch 9.0 2018-11-13
  • bash 4.4.12
$ uname -a
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux