stdin
拡張する前に、またはシェルが作業を実行する前に生のテキストを読む方法はありますか?ユーザーが文字列を入力して印刷するスクリプトを実行するとします。どのように次の動作を取得できますか?
$ sh test.sh
Please enter a string:
***<><><||&&*&$PATH
You entered:
***<><><||&&*&$PATH
''
ユーザーがそうしなくても、暗黙的にすべてのメタ文字にテキストを囲むか、すべてのメタ文字をエスケープする方法はありますか?
答え1
この試み:
$ read -r -p 'Please enter a string >>> ' var
$ printf '%q\n' "$var"
\*\*\*\<\>\<\>\<\|\|\&\&\*\&\$PATH
答え2
拡張(存在する場合)は、読み取り時ではなく印刷時に発生します。 (Gilesが言ったように、魔法は%qにありますが、echo "$ var"でさえ拡張されません。)Readはバックスラッシュを除くすべてのリテラル文字を変数として取得します。公開された変数のエコーが拡張されます。 「引用符」文字列の変数エコーは拡張されません。
xxmetac.sh:
#!/bin/bash
read str
echo you entered:
echo $str
echo "$str"
テスト:
$ ls
file1 file2 file3
$ xxmetac.sh
*
you entered:
file1 file2 file3
*
そして、ほとんどのシェルメタ文字はエコーされても特別ではありません。ファイルワイルドカードのみ可能です。
*?[-]{,}
特別ではない:
!#@$^%()|<>
$ xxmetac.sh
>
you entered:
>
>
$ xxmetac.sh
|
you entered:
|
|
$ xxmetac.sh
@$^%()|<>
you entered:
@$^%()|<>
@$^%()|<>
彼らは特別です。コマンドラインから
$ !#@$^%()|<>
@$^%()|<>
bash: syntax error near unexpected token `|'