
対話型キーボードの「読み取り」から 4 つの変数を取得する簡単なスクリプトがありますが、コマンドにコンマが含まれています。IFS 区切り値で読み取りますが、例ではキーボード入力ではなくファイルからの読み取りのみが示されています。入力を変更するトリックがありますか、それともスクリプトが読み取る正しい形式になるようにコマンドを SED/AWK にパイプする必要がありますか?
スクリプトは特別なものではなく、単にテキストを入力するだけです。入力値を追加し、入力されたテキストで実行できるコマンド文字列をエコーバックします。
[ネットワーク] [カード],[ポート] [ホスト名] 0123 0123,A1 ABCDEFG
#!/bin/bash
echo "Enter network info:"
read VAR1 VAR2 VAR3 VAR4
#I have no clue what Im doing
echo -e "${green}ping test and ssh into $VAR4${NC}"
答え1
カンマを単語の区切りとして扱うには、次のようにします。
IFS="$IFS," read a b c d
IFS
これにより、シェルがフィールド区切り文字として使用する文字のリストに、一時的にコンマが追加されます。
例として、いくつかの入力を収集してみましょう。
$ IFS="$IFS," read a b c d
1, 2,3 , 4
bash がその入力をどのように解釈したかを見てみましょう。
$ echo "a=$a b=$b c=$c d=$d"
a=1 b=2 c=3 d=4
改善
プロンプトと読み取りコマンドを組み合わせることができます。
IFS="$IFS," read -p "Enter network info: " a b c d
ドキュメンテーション
からman bash
:
IFSC の
拡張後の単語分割や、組み込みコマンドreadで行を単語に分割するために使用される内部フィールドセパレータ。デフォルト値は<space><tab><newline>
代替
何らかの理由で、sed
このタスクに実際に使用したい場合は、次の操作を実行します。
read -p "Enter network info: " a b c d < <(sed 's/,/ /g; q')
このコマンドはs/,/ /g
、sed にすべてのカンマをスペースに置き換えるように指示します。 q
最初の行の後に終了するように指示します。
孤独は<
示すリダイレクション: シェルに、read
コマンド ラインに続くファイルのようなオブジェクトからコマンドの入力を取得するように指示します。
この構造<(...)
はプロセス置換括弧内に含まれるコマンドからファイルのようなオブジェクトを作成します。そのコマンドは、sed
カンマをスペースに置き換えるコマンドです。
同じアプローチですが、awk を使用します。
read -p "Enter network info: " a b c d < <(awk '{gsub(/,/, " "); print; exit}')