ドット(.)を含むコマンドライン引数をどのように渡しますか?ドットのような文字をキャプチャするエスケープシーケンスはありますか?
シェルから次のbashスクリプトを呼び出すと機能しません。
# ./deploy.sh input.txt
./deploy.sh: line 9: input.txt: syntax error in expression (error token is ".txt")
私は以下を試しました:
- バックスラッシュ
- 引用する
- 二重引用符
- ./deploy.sh 入力(動作)
編集する
次のユースケースを例に挙げます。
- 3つのファイルがあります:server.jar client.jar gui.jar
- ソースからターゲットとしてSCPを指定する必要があります。
- ソースディレクトリ: login1@host1:/home/xyz/deploy/
- ターゲットディレクトリ: login2@host2:/data/apps/env/software/binary/
解決策:
- 配列にコピーするアーティファクトをコマンドラインから読み込みます。
- 正しいディレクトリプレフィックスを使用して、ターゲットパスとソースパス文字列を作成します。
- forループを使用して各アーティファクトをscpします(パスを検索)。
以下は、1(アーティファクトを配列として読み取る)を実行する簡単なスクリプトです。
#!/bin/bash
declare -a artifacts
for i
do
artifacts[i]=$i
echo ${artifacts[i]}
done
1を実行
-bash-3.00$ ./simple.sh arg1 arg2 arg3
arg1
arg2
arg3
ラン2
-bash-3.00$ ./simple.sh arg1.txt arg2.txt arg3.txt
./simple.sh: line 7: arg1.txt: syntax error in expression (error token is ".txt")
ベストアンサー1
declare -A
代わりに使用する必要がありますdeclare -a
。明らかに、任意の文字列パラメータを持つ連想配列をインデックスとして使用していますが、declare -a
これは整数インデックス配列でのみ機能します。 arg.txt
有効な整数として評価されないため、エラーが発生します。
編集する
バージョン3を使用しているようですbash
。残念ながら、バージョン4までは連想配列を使用できませんでした。deploy.sh
他の人から代替案のアイデアを得るために、機密性の高い個人情報を削除した元のスクリプトの削除されたバージョンを公開することをお勧めします。
編集2
チャットで送受信した内容を簡単にまとめると、次のようになります。
すべてのパラメータに対していくつかの操作を実行する最も簡単な方法は、ループを使用して繰り返すことですfor
。
for arg; do
scp login1@host1:"$arg" login2@host2:/dest/
done
すべてのインスタンスを二重引用符で囲む必要があります"$arg"
。あなたはそうですいいえパラメータはすでに配列にあるため、直接配列に入れる必要があります$@
。これはfor
、明示的に指定しない場合にデフォルトで使用されますin list...
。