現在私は以下を持っています:
#!/bin/bash
screen -p 'ScreenName' -x eval 'stuff '"'"$@"'"'\015'
echo eval 'stuff '"'"$@"'"'\015'
しかし、スクリプトを呼び出すと次のようになります。
# script.sh asd "asd" 'asd'
私の主張は次のとおりです。自閉症スペクトラム障害 自閉症スペクトラム障害
私は出力を取得します:
eval stuff 'asd asd asd'\015
私は一つを除いて:自閉スペクトル障害「自閉スペクトル障害」「自閉スペクトル障害」
すべてのパラメータ行をすべて引用符で渡すようにスクリプトを変更するにはどうすればよいですか?
答え1
シェルはスクリプトに引用符を渡しません。引用符を渡すには、バックスラッシュでエスケープしてください。
# ./script.sh asd \"asd\" \'asd\'
答え2
sh -c "screen -x 'ScreenName' -X eval 'stuff \"$@\"\015'"
答え3
注:通常の場合は機能しません。シェルしかし、吹く
唯一の解決策は、これが構文ではなく実際のコンテンツであることをシェルに表示することです。
script.sh $'asd "asd" \'asd\''
# ^^ ^ ^ ^
# || | | |
# 12 3 3 2
1:意味を変更して文字列プレフィックスを付け、$
バックスラッシュでエスケープされた引用符を受け入れます。 cfhttps://unix.stackexchange.com/a/30904/383566
2:単一引数として処理する必要があることをシェルに示すために、単一引用符の間に値を囲みます
。 3:一重引用符を囲む構文として使用されるため、バックスラッシュで一重引用符をエスケープします(2を参照)。
証明する:
# defining a function to test
> function count_and_print_args() { # if not using bash, remove the "function"
echo $# # print the number of arguments
for arg in "$@" # for each of all arguments
do
echo "$arg" # print the argument on a newline
done;
}
> count_and_print_args
0
> count_and_print_args a b c
3
a
b
c
> count_and_print_args $'asd "asd" \'asd\''
1
asd "asd" 'asd'