私はbashスクリプトがシェル実行可能ファイルを呼び出し、そのために引用符を使用する独自のコマンドシェルを作成する必要がありました。問題は、論理演算子を使用してこれを実行しようとすると、引用符が特殊文字を閉じるように見えることです&&
。たとえば、
var=("echo hello && mkdir testing")
./rshell ${var}
hello && mkdir testing
実際には演算子のロジックに従うのではなく、コマンドシェルの最終出力はhelloを正常に出力してからディレクトリテストを実行します。この問題をどのように解決できますか?
答え1
これは間違いなくように見えます。XYの問題。最終目標が何であるかを知ることは役に立ちますが、
- あなたの変数
var
は実際には大量にvar=( ... )
文法のせいで- 括弧内のすべての内容を引用したので、すべてのデータを単一の要素に追加しました。
- array()を呼び出すために正しい構文を使用していません
${var[@]}
。この場合、すべてが単一の要素にあるため、これは大きな問題ではありません。
最大の問題は、論理ANDが参照され解釈される方法のようです。配列に追加するときに引用符を付けないと、シェルはそれを評価しようとし、引用符はまだリテラル文字列であるため評価できません。この問題を(使用せずに)解決できる方法の1つは、次のものを使用することeval
でした。
スクリプトファイル
#!/bin/bash
bash -c "$(echo $@)"
$ tree
.
└── script.sh
0 directories, 1 file
$ cmd=(echo hello \&\& mkdir test)
$ ./script.sh "${cmd[@]}"
hello
$ tree
.
├── script.sh
└── test
1 directory, 1 file