~のため

~のため

":"で区切られた値のリストがありますが、1つずつ処理したいと思います。

区切り文字が空白の場合は問題ありません。

nuclear@korhal:~$ for a in 720 500 560 130; do echo $a; done
720
500
560
130

しかし、IFS(Internal Field Separator)を次のように設定した後、奇妙なことが発生し始めました。

nuclear@korhal:~$ IFS=":" for a in 720:500:560:130; do echo $a; done;
bash: syntax error near unexpected token `do'

IFSを設定するときにすべてのセミコロンをスキップする場合:

nuclear@korhal:~$ IFS=":" for a in 720:500:560:130 do echo $a done;
Command 'for' not found, did you mean:
  command 'vor' from deb vor (0.5.8-1)
  command 'fop' from deb fop (1:2.5-1)
  command 'tor' from deb tor (0.4.4.5-1)
  command 'forw' from deb mailutils-mh (1:3.9-3.2)
  command 'forw' from deb mmh (0.4-2)
  command 'forw' from deb nmh (1.7.1-7)
  command 'sor' from deb pccts (1.33MR33-6build1)
  command 'form' from deb form (4.2.1+git20200217-1)
  command 'fox' from deb objcryst-fox (1.9.6.0-2.2)
  command 'fort' from deb fort-validator (1.4.0-1)
  command 'oor' from deb openoverlayrouter (1.3.0+ds1-3)
Try: sudo apt install <deb name>

Bashはforコマンドをまったく認識しません。この場合、IFSが設定されていない場合はより多くの出力が必要になるため、プロンプトが表示されます(通常の動作)。

IFSをカスタム文字に設定するとどうなりますか? forループが機能しないのはなぜですか?

私はKubuntu 20.10 Bashバージョン5.0.17を使用しています。

ベストアンサー1

割り当て後のキーワードは認識されません。したがって(存在する場合)という一般的なコマンドを実行しますforIFS=blah for ...for

$ cat > ./for
#!/bin/sh  
echo script for
$ chmod +x ./for 
$ PATH=$PATH:.
$ for x in a b c
> ^C
$ foo=bar for x in a b c
script for

ただし、Bashは実行前に入力行全体を解析するため、このキーワードはdoその前に構文エラーを発生させます。

これは、割り当ての代わりにリダイレクトを使用するのと似ています。 複合コマンドの前にリダイレクト入力を指定できますか?そしてまた見たwhileループの入力リダイレクト演算子の順序を変更できないのはなぜですか?文法の定義方法の詳細。

また見なさい:bash forループで一時的な環境変数を使用する方法は?

私のZshはもっと厳しいです。

$ zsh -c 'foo=bar for x in a b c'
zsh:1: parse error near `for'

ただし、Zshは複合コマンドの前にリダイレクトを許可します。これにより、次の3行が出力されますtest.txt

$ zsh -c '> test.txt for x in a b c ; do echo $x; done '

また、IFS静的文字列の分割には使用されません。たとえば、720:500:560:130トークン化は拡張でのみ機能します。だから:

$ IFS=":"
$ for a in 720:500:560:130; do echo "$a"; done;
720:500:560:130

しかし、

$ IFS=":"
$ s=720:500:560:130
$ for a in $s; do echo "$a"; done;
720
500
560
130

おすすめ記事