ドットを含むbashコマンドライン引数を渡す

ドットを含むbashコマンドライン引数を渡す

ドット(.)を含むコマンドライン引数をどのように渡しますか?ドットのような文字をキャプチャするエスケープシーケンスはありますか?

シェルから次のbashスクリプトを呼び出すと機能しません。

# ./deploy.sh input.txt
./deploy.sh: line 9: input.txt: syntax error in expression (error token is ".txt")

私は以下を試しました:

  1. バックスラッシュ
  2. 引用する
  3. 二重引用符
  4. ./deploy.sh 入力(動作)

編集する

次のユースケースを例に挙げます。

  1. 3つのファイルがあります:server.jar client.jar gui.jar
  2. ソースからターゲットとしてSCPを指定する必要があります。
  3. ソースディレクトリ: login1@host1:/home/xyz/deploy/
  4. ターゲットディレクトリ: login2@host2:/data/apps/env/software/binary/

解決策:

  1. 配列にコピーするアーティファクトをコマンドラインから読み込みます。
  2. 正しいディレクトリプレフィックスを使用して、ターゲットパスとソースパス文字列を作成します。
  3. 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...

おすすめ記事