私は試みる:
- Bashで入力を受け入れて保存します。文字通りファイルとして
- 猫ファイルの内容です。
特殊文字も書かなければなりません文字通りファイルとして。
入力サンプル
./verbatim.sh -a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''
期待される出力
-a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''
実際の出力
内部引用符が削除されます。
-a smb 'ngrep -i -d $INTERFACE s.?a.?m.?b.?a.*[[:digit:]]'
パスワード
#!/bin/bash
#
# Script Name: verbatim.sh
chars='[ !"#$&()*,;<>?\^`{|}]'
for arg
do
if [[ $arg == *\'* ]]
then
arg=\""$arg"\"
elif [[ $arg == *$chars* ]]
then
arg="'$arg'"
fi
allargs+=("$arg") # ${allargs[@]} is to be used only for printing
done
printf '%s\n' "${allargs[*]}" > /tmp/pse.tmp
cat /tmp/pse.tmp
bashが私が要求したことを実行できるかどうかはわかりません。
読み取りまたはIFSを使用する方が良いですか?私のスクリプトの目的は、特定のサービスへの「クイックリファレンス」として使用されるファイルにユーザー入力を追加することです。
答え1
タイトルに関する質問
変数に特定の文字列が含まれている場合、その変数は再び拡張されません(引用されている場合)。
したがって、提案された例のケース(すべて'
に変換されます'\''
):
var='-a smb '\''ngrep -i -d $INTERFACE '\''s.?a.?m.?b.?a.*[[:digit:]]'\'''\'''
または少し減らすには(実際には必要ありませんが、Continuousを削除する方が良いです''
):
var='-a smb '\''ngrep -i -d $INTERFACE '\''s.?a.?m.?b.?a.*[[:digit:]]'\'\'
以下を印刷します(必要な文字列)。
$ echo "$var"
-a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''
スクリプトに同じ文字列を提供します。
$ ./verbatim.sh "$var"
if( verbatim.sh
) スクリプトは次のようになります。
#!/bin/bash
printf '<%s>' "$@"; echo
次のように印刷されます。
$ ./verbatim.sh "$var"
<-a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''>
書いた内容を逐語的に表現した文字列です。
ファイルに書き込む:
その入力をファイルに書き込むには、verbatim.sh
スクリプトを次のように拡張できます。
#!/bin/bash
printf '<%s>' "$@"; echo
printf '%s\n' "$var" > /tmp/pse.tmp
それから:
$ cat /tmp/pse.tmp
-a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''
要求された出力を提供します。
質問
上記は、 "$var" 内の文字列を次のように慎重に扱っているので動作します。一つパラメータではなく文字列です。
スクリプトが最初に行うことは、次のパラメータのリストを要求することです。
for arg do .......
パラメータには1つの文字列しかありません。パラメータリストが必要な場合は、手順は完全に異なる必要があります。
次に、個々のパラメータを二重引用符または一重引用符として引用します。いいえ、それも動作しません。
また、提供された文字列の内容を読んでみると、コマンドを設定して実行したいようです。それはさらに悪いです。あなた〜しなければならない読むコマンドを変数に入れようとしましたが、複雑な場合は常に失敗します!
その後、配列をパラメータとして使用するように質問を編集できます。
答え2
これは不可能です。
次のコマンドを実行すると、
myprog a
myprog \a
myprog "a"
myprog 'a'
その後、4つの場合、すべて最初の引数に対して取得された値は文字列へmyprog
のポインタになり、"a"
どの値が与えられたのかわかりません。したがって、myprog
呼び出し前にも引数が処理されるため、与えられた内容を文字通り作成することはできません。