以下のようなUnixシェル変数があるとします
variable=abc,def,ghij
forループを使用してすべての値(abc
、def
およびghij
)を抽出し、各値をプロシージャに渡したいです。
スクリプトは、任意の数のカンマ区切り値をから抽出できるようにする必要があります$variable
。
以下のようなUnixシェル変数があるとします
variable=abc,def,ghij
forループを使用してすべての値(abc
、def
およびghij
)を抽出し、各値をプロシージャに渡したいです。
スクリプトは、任意の数のカンマ区切り値をから抽出できるようにする必要があります$variable
。
回答:
次のスクリプトを使用すると、フィールドがいくつあっても、変数がコンマで区切られている限り、変数を動的にトラバースできます。
variable=abc,def,ghij
for i in $(echo $variable | sed "s/,/ /g")
do
# call your procedure/other scripts here below
echo "$i"
done
代わりのecho "$i"
間に上記の呼び出し、do
およびdone
ループの内側に、あなたはあなたのプロシージャを呼び出すことができますproc "$i"
。
更新:上記のスニペットは、変数の値にスペースが含まれていない場合に機能します。このような要件がある場合は、変更可能なソリューションの1つを使用してIFS
、変数を解析してください。
お役に立てれば。
$variable
、空白が含まれている場合は機能しません。たとえば、variable=a b,c,d
=>は3(ab | c | d)ではなく4行(a | b | c | d)を出力します
"value
**のような新しい見積もりが追加されています。それを削除する正規表現がある場合は更新してください..
IFSをいじら
ない外部コマンドを呼び出さない
variable=abc,def,ghij
for i in ${variable//,/ }
do
# call your procedure/other scripts here below
echo "$i"
done
bash文字列操作の使用http://www.tldp.org/LDP/abs/html/string-manipulation.html
IFS
!
$i
がスペースを含んでいる場合、それらは分割されます(それがスペース区切りではなくコンマ区切りとして渡される理由である可能性があります)
for i in ${variable//,/$IFS} do; echo "$i"; done
別のフィールド区切り記号を設定する場合は、直接for
ループを使用できます。
IFS=","
for v in $variable
do
# things with "$v" ...
done
値を配列に格納してから、「Bashで区切り文字で文字列を分割するにはどうすればよいですか?」に示すようにループすることもできます。:
IFS=, read -ra values <<< "$variable"
for v in "${values[@]}"
do
# things with "$v"
done
$ variable="abc,def,ghij"
$ IFS=","
$ for v in $variable
> do
> echo "var is $v"
> done
var is abc
var is def
var is ghij
このソリューションには、カンマ区切りのリストを反復処理し、各エントリに対してコマンドを実行する方法の幅広いアプローチがあります。。
2番目のアプローチの例:
$ IFS=, read -ra vals <<< "abc,def,ghij"
$ printf "%s\n" "${vals[@]}"
abc
def
ghij
$ for v in "${vals[@]}"; do echo "$v --"; done
abc --
def --
ghij --
while
配列に読み込むためにそしてもう1つは結果をループするために。
IFS
以前の状態に戻す必要がありますか?
これを試してみてください。
#/bin/bash
testpid="abc,def,ghij"
count=`echo $testpid | grep -o ',' | wc -l` # this is not a good way
count=`expr $count + 1`
while [ $count -gt 0 ] ; do
echo $testpid | cut -d ',' -f $i
count=`expr $count - 1 `
done
http://stackoverflow.com/questions/8629330/unix-count-of-columns-in-file
。その後、forループをwhileループに入れます。あなたはそれを手に入れることができます。
IFSを使用せず、スペースを維持する別のソリューション:
$ var="a bc,def,ghij"
$ while read line; do echo line="$line"; done < <(echo "$var" | tr ',' '\n')
line=a bc
line=def
line=ghij
以下は、IFSを変更せず、カスタム正規表現の区切り文字を取り込むことができる純粋なbashソリューションです。
loop_custom_delimited() {
local list=$1
local delimiter=$2
local item
if [[ $delimiter != ' ' ]]; then
list=$(echo $list | sed 's/ /'`echo -e "\010"`'/g' | sed -E "s/$delimiter/ /g")
fi
for item in $list; do
item=$(echo $item | sed 's/'`echo -e "\010"`'/ /g')
echo "$item"
done
}