私はbashエミュレート端末を使用してWindows 7でbashスクリプトを開発しています。正確に言えば、MobaXterm 9.1でbash端末を使用しています。その理由はWindows 7ラップトップがありますが、私のスクリプトは最終的にJenkins Linuxサーバーで実行されるためです。
パスにスペースや(または)が含まれていると、スクリプトは正常に実行されません。
私のスクリプトは次のとおりです
#!/bin/bash
eclexe0="C:\Program Files (x86)\HPCCSystems\6.0.4\clienttools\bin\ecl.exe"
eclexe1="/drives/c/Program Files (x86)/HPCCSystems/6.0.4/clienttools/bin/ecl.exe"
clear
#1
echo "Testing if ecl.exe is available..."
if [ -f "$eclexe0" ]; then
echo "FOUND." >&2
else
echo "NOT FOUND." >&2
exit 1
fi
echo "Executing ecl.exe"
echo 1
eval "$eclexe0"
echo 2
私が実行すると、出力は次のようになります。
ご覧のとおり、スクリプトはパスに満足していません。C:\プログラムファイル(x86)。ファイルを別のパス(C:¥oscar¥eclfolder)に移動すると機能します。私は答えを試しましたここしかし、うまくいきません。それはおそらくWindows 7を使っているからです。
このスクリプトをどのように機能させることができますか?
答え1
eval
実行可能ファイルのパス名で実行されているため、スクリプトは機能しません。
すべてのシェルスクリプトで変数を使用して、実行するコマンドを指定できます。
引用符を引用しない場合、$variable
変数の内容もスペースに基づいて別々の単語に分割されます。
変数参照を引用しました。ただし、 を実行するとeval
変数拡張の結果が解析されます。第二時間。必要ありません。
次の画像は有益かもしれません。
$ ls
file.txt file2.txt
$ somevar=ls
$ $somevar
file.txt file2.txt
$ ls -l
total 0
-rw-r--r-- 1 Me staff 0 Sep 2 16:06 file.txt
-rw-r--r-- 1 Me staff 0 Sep 2 16:06 file2.txt
$ somevar='ls -l'
$ $somevar
total 0
-rw-r--r-- 1 Me staff 0 Sep 2 16:06 file.txt
-rw-r--r-- 1 Me staff 0 Sep 2 16:06 file2.txt
$ "$somevar"
bash: ls -l: command not found
$
ご覧のとおり"ls -l"
、引用符を実行しようとすると、シェルは次のコマンドを探します。精密名前 - スペースを含みます。
私の場合、これは私が望むものではありません。
しかし、あなたの例でははいあなたは何が欲しいですか?
を使用する必要はありませeval "$eclexe0"
ん"$eclexe0"
。
大きな写真
無料のアドバイス:Linuxシステムでスクリプトを実行したい場合は、Linuxシステムでテストしてください。 MobaXtermはLinuxボックスではありません。
VagrantとVirtualBox(両方とも無料)をインストールしてテストできる仮想マシンを作成します。
追加資料:
答え2
この記事では、次のように引用符 ("\"string"\") をエスケープする必要があるかもしれません。https://stackoverflow.com/questions/5253782/bash-problem-with-eval-variables-and-quotes