Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

Shell Script ワンライナーで改行

Shell Script カテゴリを作った方がいいかも。

[nuts@cclub mail]$ sh -c 'for i in `ls -la |
  grep -E "\-rw\-+\W+1 \w+\W+[0-9]{3}" |
  perl -pe "s/.+ (\w+)/\1/g"`; do echo chown :cclub $i; done'
chown :cclub bar
chown :cclub baz
 :
 : 
[nuts@cclub mail]$ sudo sh -c 'for i in `ls -la
  | grep -E "\-rw\-+\W+1 \w+\W+[0-9]{3}"
  | perl -pe "s/.+ (\w+)/\1/g"`; do echo chown :cclub $i; done'
Syntax error: "|" unexpected 
[nuts@cclub mail]$ sudo sh -c 'for i in `ls -la \
  | grep -E "\-rw\-+\W+1 \w+\W+[0-9]{3}" \
  | perl -pe "s/.+ (\w+)/\1/g"`; do echo chown :cclub $i; done'
chown :cclub bar
chown :cclub baz
 :
 : 

行末に "|" が来る場合はいいけど、行頭に "|" が来る場合は行末の改行を "\" でエスケープしなければならない。

というか、

[nuts@cclub mail]$ sh -c 'for i in `ls -la | \
  grep -E "\-rw\-+\W+1 \w+\W+[0-9]{3}" | \
  perl -pe "s/.+ (\w+)/\1/g"`; do echo chown :cclub $i; done'
chown :cclub bar
chown :cclub baz
 :
 : 

結局いつも改行はエスケープするようにしておけば心配ない。