
ãã®èšäºã§ã¯ãBashããã°ã©ããŒã«ãããšã©ãŒã«ã€ããŠèª¬æããŸãã äžèšã®äŸã«ã¯ãã¹ãŠããã€ãã®æ¬ é¥ããããŸãã åžžã«åŒçšç¬Šã䜿çšããåèªåå²ã䜿çšããªãå Žåã¯ã以äžã§èª¬æãããšã©ãŒã®å€ããåé¿ã§ããŸãïŒ ã¯ãŒããã¬ã€ãã³ã°ã¯ãBourneã·ã§ã«ããç¶æ¿ãããæ¬ é¥ã®ããã¬ã¬ã·ãŒãã©ã¯ãã£ã¹ã§ãã å±éãåŒçšç¬Šã§å²ãŸãªãå Žåãããã©ã«ãã§äœ¿çšãããŸãã äžè¬ã«ãèœãšã穎ã®å€§éšåã¯åŒçšç¬Šãªãã®çœ®æã«äœããã®åœ¢ã§é¢ä¿ããŠãããåèªã®åå²ãšçµæã®ã°ããã³ã°ã«ã€ãªãããŸãã
1. $ã®iïŒls * .mp3ïŒ
BASHããã°ã©ããŒãç¯ãæãäžè¬çãªééãã®1ã€ã ãã®ãããªãµã€ã¯ã«ãæžãããšã§è¡šçŸãããŸãïŒ
for i in $(ls *.mp3); do
ã¯ãã
ls
ã®åºåãåŠçãããããã¡ã€ã«åã®ãªã¹ããšããŠ
find
ããŠå埩ããã
find
ãšäŸ¿å©ã§ãã ãããã
ã§ããŸãã ã ãã®ã¢ãããŒãã¯å®å
šã«èª€ãã§ãããä¿®æ£ããæ¹æ³ã¯ãããŸããã ããã«å®å
šã«ç°ãªãã¢ãããŒããããå¿
èŠããããŸãã
ããã«ã¯å°ãªããšã5ã€ã®åé¡ããããŸãã
- ãã¡ã€ã«åã«ã¹ããŒã¹ãå«ãŸããŠããå Žåã WordSplittingã®å¯Ÿè±¡ãšãªããŸãã çŸåšã®ãã©ã«ãã«
01 - Don't Eat the Yellow Snow.mp3
ãšããååã®ãã¡ã€ã«ããããšããŸãã for
ã«ãŒãã¯ååèªãå埩åŠçãã01ã-ãDo n'tãEatãªã©ã®çµæãçæããŸãã
- ãã¡ã€ã«åã«ã°ããæåãå«ãŸããŠããå Žåãã°ããã³ã°ïŒã ã°ããã³ã° ãïŒãè¡ãããŸãã åºå
ls
ã«æå*ãå«ãŸããŠããå Žåããããå±ããåèªã¯ãã³ãã¬ãŒããšèŠãªãããããã«å¯Ÿå¿ãããã¹ãŠã®ãã¡ã€ã«åã®ãªã¹ãã«çœ®ãæããããŸãã ãã¡ã€ã«ãã¹ã«ã¯ãNUL以å€ã®ä»»æã®æåãå«ããããšãã§ããŸãã ã¯ããæ¹è¡ãå«ãã
ls
ãŠãŒãã£ãªãã£ã¯ãã¡ã€ã«åãç Žæããå¯èœæ§ããããŸãã äœæ¥ãããã©ãããã©ãŒã ã䜿çšããïŒãŸãã¯äœ¿çšããªãïŒåŒæ°ãããã³æšæºåºåã端æ«ã瀺ããŠãããã©ããã«ãã£ãŠã ls
ã¯ãã¡ã€ã«åã®äžéšã®æåãçªç¶ãïŒãã«çœ®ãæããå ŽåããããŸãã ãŸãã¯ããŸã£ãã衚瀺ããªãããã«ããŸãã lsåºåãè§£æããããšããªãã§ãã ãã ã
- CommandSubstitutionã¯ãåºåãããã¹ãŠã®æ«å°Ÿã®æ¹è¡ãåãæšãŠãŸãã äžèŠãããšã
ls
ã¯æ°ããè¡ã远å ãããããããã¯è¯ãããšã§ãã ãããããªã¹ãã®æåŸã®ãã¡ã€ã«åãæ°ããè¡ã§çµããå Žåã `...`ãŸãã¯$()
ã¯åé€ããã远å ãããŸãã
ãŸããäºéåŒçšç¬Šãå²ãããšã¯ã§ããŸããã
for i in "$(ls *.mp3)"; do
ããã«ãããåºå
ls
å
šäœã1ã€ã®åèªãšèŠãªãããŸãã åãã¡ã€ã«åãå埩åŠçãã代ããã«ãã«ãŒãã
1åå®è¡ãããçµåããããã¡ã€ã«åããæååå€ã
i
ã«å²ãåœãŠãŸãã ãŸãã
IFSãæ°ããè¡ã«å€æŽããããšã¯ã§ããŸããã ãã¡ã€ã«åã«ã¯æ¹è¡ãå«ãŸããå ŽåããããŸãã
ãã®ãããã¯ã®ãã1ã€ã®ããªãšãŒã·ã§ã³ã¯ãã¯ãŒããã¬ãŒã¯ã®èª€çšãšããã¡ã€ã«ã®è¡ãïŒèª€ã£ãŠïŒèªã¿åãforã«ãŒãã§ãã äŸïŒ
IFS=$'\n' for line in $(cat file); do ...
ããã¯æ©èœããŸããïŒ ç¹ã«æååããã¡ã€ã«åã®å Žåã BashïŒBourneãã¡ããªãŒã®ä»ã®ã·ã§ã«ãšåæ§ïŒã¯ããã®ããã«ã¯æ©èœããŸããã äžèšã®ãã¹ãŠã«å ããŠã
ls
èªäœã䜿çšããå¿
èŠã¯ãŸã£ãããããŸããã ããã¯å€éšã³ãã³ãã§ããããã®åºåã¯äººéãèªãããã«ç¹å¥ã«èšèšãããŠãããã¹ã¯ãªããã®è§£æçšã§ã¯ãããŸããã
ããã§ãããªãã¯ã©ããã£ãŠãããæ£ããããŸããïŒããšãã°ã
find
ã
-exec
ãšçµã¿åãããŠäœ¿çšââã
find
ã
find . -type f -exec some command {} \;
ls
代ããã«
ls
ãã®ãªãã·ã§ã³ãæ€èšã§ããŸãã
for i in *.mp3; do
Bashã®ãããªPOSIXã·ã§ã«ã«ã¯ãç¹ã«ãã®ããã®ã°ããã³ã°ããããã£ããããŸããããã«ããããããããããã¡ã€ã«åã®ãªã¹ãã«ãã³ãã¬ãŒããé©çšã§ããŸãã å€éšãŠãŒãã£ãªãã£ã®çµæãè§£éããå¿
èŠã¯ãããŸããã ã°ããã³ã°ã¯çœ®ææé ã®æåŸã®ã¹ãããã§ãããããåŒçšç¬Šãªãã®çœ®æã®åœ±é¿ãåããªãåã
ã®åèªã«
*.mp3
ãã¿ãŒã³ãæ£ããé©çšãããŸãã ãã¡ã€ã«ãååž°çã«åŠçããå¿
èŠãããå Žåã¯ã
UsingFindã䜿çšããããBash 4
shopt -s globstar
詳ããèŠãŠãã ããã
質åïŒ * .mp3ãã¿ãŒã³ã«äžèŽãããã¡ã€ã«ãçŸåšã®ãã©ã«ããŒã«ãªãå Žåã¯ã©ããªããŸããïŒ
for
ã«ãŒãã¯
i="*.mp3"
ã§1åå®è¡ãããŸãããããã¯äºæãããåäœã§ã¯ãããŸããïŒ ãã®åé¡ã®è§£æ±ºçãšããŠãé©åãªãã¡ã€ã«ã®ååšã®ç¢ºèªã䜿çšã§ããŸãã
å¥ã®è§£æ±ºçã¯ã
shopt -s nullglob
Bashããããã£ã䜿çšããããš
shopt -s nullglob
ã ãã ããããã¯ããã¥ã¡ã³ããèªãã§ããã®ã¹ã¯ãªããã®ä»ã®ãã¹ãŠã®ã°ããŒãã«å¯Ÿãããã®èšå®ã®åœ±é¿ãæ
éã«è©äŸ¡ããåŸã«ã®ã¿è¡ãããšãã§ããŸãã ã«ãŒãæ¬äœã®
$i
å²ãåŒçšç¬Šã«æ³šæããŠãã ããã ããã¯ã2çªç®ã®åé¡ã«ã€ãªãããŸãã
2. cp $ file $ã¿ãŒã²ãã
ãã®ããŒã ã®äœãåé¡ã«ãªã£ãŠããŸããïŒ åºæ¬çã«ã
$file
ãš
$target
ã¹ããŒã¹ãã¯ã€ã«ãã«ãŒããå«ãŸããŠããªãããšãäºåã«ããã£ãŠ
ããã°åé¡ãããŸããã ãã ãã眮æã®çµæã¯åŒãç¶ãWordSplittingãšãã¡ã€ã«ãã¹ã®çœ®æã®å¯Ÿè±¡ãšãªããŸãã ãããã£ãŠããã©ã¡ãŒã¿ãŒã®å±éã¯åžžã«äºéåŒçšç¬Šã§å²ã¿ãŸãã
cp -- "$file" "$target"
ãã以å€ã®å Žåã¯ã
cp 01 - Don't Eat the Yellow Snow.mp3 /mnt/usb
cp: cannot stat `01': No such file or directory
cp 01 - Don't Eat the Yellow Snow.mp3 /mnt/usb
cp: cannot stat `01': No such file or directory
ãããªãšã©ãŒã«ãªã
cp: cannot stat `01': No such file or directory
ã
$file
ã«ã¯ã€ã«ãã«ãŒãæåïŒ
*ãŸãã¯
ïŒãŸãã¯
[ ïŒãå«ãŸããå ŽåãäžèŽãããã¡ã€ã«ãããå Žåã«ã®ã¿å±éãããŸãã äºéåŒçšç¬Šã䜿çšãããšãã$ãã¡ã€ã«ãã®å
é ã«ã-ããçŸãããŸã§ãã¹ãŠåé¡ãããŸããã ãã®å Žåã
cp
ã¯ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ããã£ãŒãããããšããŠãããšå€æããŸãïŒæ¬¡ã®ç« ãåç
§ïŒã
ããã€ãã®ç°åžžãªç¶æ³ã§ãã倿°ã®å
容ãä¿èšŒã§ããå Žåãç¹ã«ãã¡ã€ã«åãå«ãŸããŠããå Žåããã©ã¡ãŒã¿ãŒãåŒçšç¬Šã§å²ãããšã¯é©åã§äžè¬çãªæ¹æ³ã§ãã çµéšè±å¯ãªã¹ã¯ãªããäœæè
ã¯åžžã«åŒçšç¬Šã䜿çšããŸãããã ãããŸãã«ãã³ãŒãã³ã³ããã¹ããããã©ã¡ãŒã¿ãŒã«ä¿èšŒãããå®å
šãªå€ãå«ãŸããŠããããšãæãããªå Žåãé€ããŸãã å°éå®¶ã¯ããããã
cp
ã³ãã³ãããããŒã®äœ¿çšã¯ééãã§ãããšå€æããã§ãããã ããªããããæãã¹ãã§ãã
3.åã«ãã€ãã³ãä»ãããã¡ã€ã«å
ãã€ãã³ãåã«ä»ãããã¡ã€ã«åã¯ãå€ãã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
*.mp3
ãããªã°ããŒã
*.mp3
ïŒçŸåšã®ãã±ãŒã«ã«å¿ããŠïŒæ¡åŒµãªã¹ãã«ãœãŒããããã»ãšãã©ã®ãã±ãŒã«ã§ã¯ãã€ãã³ãæåã«ãœãŒããããæ¬¡ã«æåããœãŒããããŸãã æ¬¡ã«ããªã¹ãã
-filename
ããªãã·ã§ã³ãšããŠèª€ã£ãŠè§£éããå¯èœæ§ã®ããã³ãã³ãã«æž¡ãããŸãã ãã®ç¶æ³ã«ã¯2ã€ã®äž»ãªè§£æ±ºçããããŸãã
1ã€ç®ã¯ãã³ãã³ãïŒäŸïŒ
cp
ïŒãšãã®åŒæ°ã®éã«2ã€ã®ãã€ãã³ïŒ
--
ïŒãæ¿å
¥ããããšã§ãã ããã¯ãªãã·ã§ã³ã®æ€çŽ¢ã忢ããããã®ã·ã°ãã«ãšãªãããã¹ãŠãæ£åžžã«ãªããŸãã
cp -- "$file" "$target"
ãããããã®ã¢ãããŒãã«ã¯åé¡ããããŸãã å¿
ãæ¿å
¥ããå¿
èŠããã
ãŸã --
ã³ã³ããã¹ãã§ãã©ã¡ãŒã¿ãŒ
ã䜿çšãã
ãã³ã« ããªãã·ã§ã³ãšããŠè§£éã§ããå Žåã ãããŠãããã¯å€ãã®åé·æ§ãæå³ããç°¡åã«äœããèŠéãå¯èœæ§ããããŸãã
è§£æãªãã·ã§ã³çšã®é©åã«äœæãããã©ã€ãã©ãªã®ã»ãšãã©ã¯ãããçè§£ããŠãããæ£ãã䜿çšãããããã°ã©ã ã¯ãã®æ©èœãç¡æã§ç¶æ¿ããå¿
èŠããããŸãã ãã ãããªãã·ã§ã³ã®çµãããèªèãã責任ã¯ã¢ããªã±ãŒã·ã§ã³ã«ã®ã¿ããããšã«çæããŠãã ããã ãªãã·ã§ã³ãæåã§è§£æããããã°ã©ã ã誀ã£ãŠè§£æããããã°ã©ã ããŸãã¯ãµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšããããã°ã©ã ã§ã¯ãæ«å°Ÿãèªèãããªãå ŽåããããŸãã POSIXã§èª¬æãããŠããããã€ãã®äŸå€ãé€ããæšæºãŠãŒãã£ãªãã£ã¯ãã
ãè¡ã
å¿
èŠããããŸãã ããšãã°ã
echo
ã
å¥ã®ãªãã·ã§ã³ã¯ããã¡ã€ã«åãåžžã«ãã©ã«ããŒã§å§ãŸãããšã確èªããããšã§ãã ãã®ããã«ãçžå¯ŸãŸãã¯çµ¶å¯Ÿãã¡ã€ã«ãã¹ã䜿çšãããŸãã
for i in ./*.mp3; do cp "$i" /target ... done
ãã®å Žåãååããã€ãã³ã§å§ãŸããã¡ã€ã«ãããå Žåã§ããglobã®ãããã§ã倿°ã«ã¯åžžã«
./-foo.mp3
ãããªãã®ãå«ãŸããããšã確èªã§ããŸãã ãããŠãããã¯
cp
ã«é¢ããŠã¯å®å
šã«å®å
šã§ãã
æåŸã«ããã¹ãŠã®çµæã«åãæ¥é èŸãä»ãã倿°ãã«ãŒãã®æ¬äœã§æ°åãã䜿çšãããªãããšãä¿èšŒã§ããå Žåã眮ææã«æ¥é èŸãåçŽã«é£çµã§ããŸãã çè«çã«ã¯ãååèªã®ããã€ãã®äœåãªæåã®çæãšä¿åãç¯çŽãããŸãã
for i in *.mp3; do cp "./$i" /target ... done
4. [$ foo = "bar"]
ãã®ç¶æ³ã¯ã第2ç« ã§èª¬æããåé¡ã«éåžžã«äŒŒãŠããŸãã ããããããã§ãéåžžã«éèŠãªã®ã§ç¹°ãè¿ããŸãã ããããŒè¡ã®åŒçšç¬Šã¯ãå¿
èŠãªå Žæã§ã¯ãããŸããã Bashã§ã¯ãæååãªãã©ã«ãåŒçš
ããå¿
èŠã¯ãããŸãã ïŒã¡ã¿æåãŸãã¯ãã¿ãŒã³æåãå«ãŸããŠããå Žåãé€ãïŒã ãã ãã倿°ã«ã¹ããŒã¹ãŸãã¯ã¯ã€ã«ãã«ãŒããå«ããããšãã§ããå Žåã¯ã倿°ãåŒçšç¬Šã§å²ã
å¿
èŠã
ãããŸãã
ãã®äŸã¯ãããã€ãã®çç±ã§å£ããå¯èœæ§ããããŸãã
Bashãä»ã®å€ãã®kshã®ãããªã·ã§ã«ã«ã¯ã
[[ã䜿çšããåªããä»£æ¿ææ®µããããŸãã
=
[[ ]]
ã®å·ŠåŽã«ãã倿°ã¯ãåèªã®åå²ãã°ããã³ã°ã®åœ±é¿ãåããªããããåŒçšç¬Šã§å²ãå¿
èŠã¯ãããŸããã ãŸãã空ã®å€æ°ãæ£ããåŠçãããŸãã äžæ¹ãåŒçšç¬Šã䜿çšããŠã害ã¯ãããŸããã
[
ããã³
test
ãšã¯ç°ãªãã
==
ã䜿çšã§ããŸãã
[[
ã䜿çšããŠæ¯èŒããå ŽåãåçŽãªæå忝èŒã§ã¯ãªããå³åŽã®æååã«å¯ŸããŠãã¿ãŒã³ãããã³ã°ãå®è¡ãããããšã«æ³šæããŠãã ããã æ£ããæååããªãã©ã«ã«ããã«ã¯ããã¿ãŒã³ãããã³ã°ã®ã³ã³ããã¹ãã§ç¹å¥ãªæå³ãæã€æåã䜿çšãããšãã«åŒçšç¬Šã§å²ãå¿
èŠããããŸãã
ããªãã¯ããããåæ§ã®ã³ãŒããèŠãŠããŸããïŒ
éåžžã«å€ãã·ã§ã«ã§å®è¡ãããã³ãŒãã®å Žåãããã¯x "
$foo
"ãå¿
èŠã§ãã ããã§ã
[[
ããåå§çãª
[
ã
$foo
ããã€ãã³ã§å§ãŸãå Žåãæ··ä¹±ãçããŸãã å€ãã·ã¹ãã ã§ã¯ã
[
=
ã®å³åŽã®ããŒã¯ã³ããã€ãã³ã§å§ãŸããã©ããã¯æ°ã«ããŸããã 圌女ã¯ãããæåéã䜿çšããŠããŸãã ãã®ãããå·ŠåŽã«æ³šæããå¿
èŠããããŸãã
ãã®åé¿çãå¿
èŠãšããã·ã§ã«ã¯POSIXäºæã§ã¯ãªãããšã«æ³šæããŠãã ããã Heirloom Bourneã§ãããããå¿
èŠãšããŸããïŒããããããã¯ãæãäžè¬çãªã·ã¹ãã ã·ã§ã«ã®1ã€ã§ããBourneã·ã§ã«ã®POSIXã¯ããŒã³ã§ã¯ãªãå¯èœæ§ããããŸãïŒã ãã®ãããªæ¥µç«¯ãªç§»æ€æ§ãèŠæ±ãããããšã¯ãã£ãã«ãªããã³ãŒããèªã¿ã«ãããªããçŸãããªããŸãã
5. cd $ïŒãã£ã¬ã¯ããªåã$ fãïŒ
åŒçšç¬Šã«é¢é£ããå¥ã®ãšã©ãŒã 倿°å±éã®å Žåãšåæ§ã«ãã³ãã³ã眮æã®çµæã¯ãåèªãšãã¡ã€ã«ãã¹ã®çœ®æã«åå²ãããŸãã ãããã£ãŠãåŒçšç¬Šã§å²ã¿ãŸãã
cd -P -- "$(dirname -- "$f")"
åŒçšç¬Šã®ãã¹ãã®èåŸã«ããããžãã¯ã¯ãããã§ã¯å®å
šã«æããã§ã¯ãããŸããã Cããã°ã©ããŒã¯ã1çªç®ãš2çªç®ã®äºéåŒçšç¬Šãã°ã«ãŒãåããã3çªç®ãš4çªç®ã®äºéåŒçšç¬ŠãçµåãããããšãæåŸ
ããŸãã ããããBashã§ã¯ããã¹ãŠãç°ãªããŸãã Bashã¯ãã³ãã³ã眮æå
ã®äºéåŒçšç¬Šã1ã€ã®ãã¢ãšããŠæ±ãã眮æå€ã®äºéåŒçšç¬Šãå¥ã®ãã¢ãšããŠæ±ããŸãã
å¥ã®æ¹æ³ã§èšè¿°ããããšãã§ããŸããããŒãµãŒã¯ã³ãã³ã眮æãããã¹ãã¬ãã«ããšããŠæ±ããå
éšã®åŒçšç¬Šã¯å€éšã®åŒçšç¬Šãšã¯å¥ã«ç§»åããŸãã
6. ["$ foo" = bar && "$ bar" = foo]
å€ã
ãã¹ãïŒãŸãã¯[ïŒã³ãã³ãå
ã§ã¯
&&
ã䜿çšã§ããŸããã BashããŒãµãŒã¯ã
[[ ]]
ãŸãã¯
(( ))
å€åŽã§
&&
ãæ€åºãããã®çµæãã³ãã³ãã
&&
ååŸã§
2ã€ã®ããŒã ã«åå²ããŸãã 代ããã«ã次ã®2ã€ã®ãªãã·ã§ã³ã®ããããã䜿çšããŸãã
[ bar = "$foo" ] && [ foo = "$bar" ]
ïŒç¬¬4ç« ã§è¿°ã¹ãéºç£ã®ããã«ã宿°ãšå€æ°ã
[
å
ã§äº€æããŸããããŸãã
[[
亀æããããšãã§ããŸããããã³ãã¬ãŒããšããŠè§£éããªãããã«ããã«ã¯ãåŒçšç¬Šã䜿çšããå¿
èŠããããŸãïŒ
åãããšã
||
ãåœãŠã¯ãŸããŸã ã
[[
ãŸãã¯2ã€ã®ã³ãã³ã
[
䜿çšããŸãã
ãããé¿ããŠãã ããïŒ
[ bar = "$foo" -a foo = "$bar" ]
ãã€ããªæŒç®å
-a
ã
-o
ããã³ïŒ/ïŒïŒã°ã«ãŒãåïŒã¯ãPOSIXæšæºã«å¯ŸããXSIæ¡åŒµã§ãã POSIX-2008ã§ã¯ããããã¯ãã¹ãŠéæšå¥šãšããŠããŒã¯ãããŠããŸãã æ°ããã³ãŒãã§ãããã䜿çšãã䟡å€ã¯ãããŸããã
[ A = B -a C = D ]
ïŒãŸãã¯
-o
ïŒã«é¢é£ããå®éçãªåé¡ã®1ã€ã¯ã
POSIXã test
ã®çµæã
決å®ããªãããšããŸãã¯4ã€ä»¥äžã®åŒæ°ã䜿çšããããšã§ãã ããã¯ããããã»ãšãã©ã®ã·ã§ã«ã§æ©èœããŸãããæåŸ
ããããšã¯ã§ããŸããã POSIXã·ã§ã«çšã«äœæããå¿
èŠãããå Žåã¯ã
&&
æŒç®åã§åºåããã2ã€ã®
test
ãŸãã¯
[
ã³ãã³ãã䜿çšããŸãã
7. [[$ foo> 7]]
ããã«ã¯ããã€ãã®ãã€ã³ãããããŸãã ãŸãã
[[
ã¯ç®è¡åŒãèšç®ããããã ãã«äœ¿çšãã¹ãã§ã¯ãããŸããã ãµããŒããããŠãããã¹ãã¹ããŒãã¡ã³ãã®1ã€ãå«ããã¹ãåŒã«äœ¿çšããå¿
èŠããããŸãã æè¡çã«ã¯
[[
æŒç®åã䜿çšããŠèšç®ãå®è¡
ã§ããŸã
ã ãåŒã®ã©ããã«ååšããéæ°åŠçãªãã¹ãæŒç®åã®1ã€ãšçµã¿åãããŠãããè¡ãããšã¯æå³ããããŸãã æ°å€ããŒã¿ãæ¯èŒããã ãã®å ŽåïŒãŸãã¯ä»ã®ç®è¡æŒç®ãå®è¡ããå ŽåïŒã¯ã
(( ))
ã䜿çšããæ¹ãã¯ããã«åªããŠããŸãã
[[ ]]
å
ã§>æŒç®åã䜿çšãããšãã·ã¹ãã ã¯ãããæ°å€ã§ã¯ãªããæååããŒã¿ã®æ¯èŒïŒãã±ãŒã«ã«ãããœãŒãé ã®ãã§ãã¯ïŒãšããŠæ±ããŸãã æã
ããã¯æ©èœãããããããŸããããããã¯ããªãããããæãæåŸ
ããŠããªãæã«ã¡ããã©ããªãã倱æãããŸãã ããã«æªãããšã«ãuse> inside
[ ]
ïŒããã¯åºåã®ãªãã€ã¬ã¯ãã§ãã 7ãšããååã®ãã¡ã€ã«ããã©ã«ããŒã«è¡šç€ºããã
$foo
äœãããããŸã§ãã¹ãã¯æ£åžžã«å®è¡ãããŸãã
POSIXãšã®å³å¯ãªäºææ§ãå¿
èŠã§ãã³ãã³ã
((
ããã®åŸãæãªããã®
[
::
$foo
æŽæ°ã§ãªãå Žåã
test ... -gt
ã¯å€±æããããšã«æ³šæããŠãã ããã ãããã£ãŠãåŒçšç¬Šã§å²ãããšã¯ããã©ãŒãã³ã¹ã®ããã ãã«æå³ããããäžéšã®ã·ã§ã«ã§å¯äœçšã®å¯èœæ§ãæžããããã«åŒæ°ãåäžã®åèªã«åå²ããŸãã
ç®è¡ã³ã³ããã¹ãïŒ
((
ãŸãã¯
let
ïŒãå«ãïŒãŸãã¯æ°å€æ¯èŒãå«ããã¹ãåŒ
[
ã®å
¥åãä¿èšŒã§ããªãå Žåãèšç®ãå®è¡ããåã«
åžžã«å
¥åãæ€èšŒããå¿
èŠ
ããããŸãã
8. grep foo bar | èªã¿åãäž-r; doïŒïŒcount ++ïŒïŒ; ãã£ã
ãã®ã³ãŒãã¯æ£åžžã«èŠããŸããïŒ ãã¡ãããããã¯
grep -c
åãªãå¹³å¡ãªå®è£
ã§ãããããã¯åçŽã«ããããã«è¡ãããŠããŸãã åãã€ãã©ã€ã³ã³ãã³ãã¯åå¥ã®ãµãã·ã§ã«ã§å®è¡ãããããã
count
倿Žã¯
while
å¢çãè¶ããŠäŒæããŸããã ããæç¹ã§ãããã¯Bashã®åå¿è
ãé©ãããŸãã
POSIXã¯ããã€ãã©ã€ã³ã®æåŸã®èŠçŽ ããµãã·ã§ã«ã§è©äŸ¡ããå¿
èŠããããã©ããã倿ããŸããã
shopt -s lastpipe
ããksh93ãBash> = 4.2ãªã©ã®äžéšã®ã·ã§ã«ã¯ããµã³ãã«ã®ã·ã§ã«ããã»ã¹ã§
while
ãå®è¡ããå¯äœçšãåŒãèµ·ããå¯èœæ§ããããŸãã ãããã£ãŠãããŒã¿ãã«ã¹ã¯ãªããã¯ããã®ãããªåäœã«äŸåããªãããã«äœæããå¿
èŠããããŸãã
ãã®åé¡ãåæ§ã®åé¡ã解決ããæ¹æ³ã¯ã
Bash FAQïŒ24ããèŠã€ããããšãã§ããŸãã ããã§èª¬æããã«ã¯é·ãããŸãã
9. if [grep foo myfile]
å€ãã®åå¿è
ã¯ããã®ããŒã¯ãŒãã®çŽåŸã«
[
ãŸãã¯
[[
ç¶ãããšãå€ãããã
if
åŒã«ã€ããŠèª€è§£ããŠããŸãã Cã®
if
ã§äœ¿çšãããåçŽãªæ¬åŒ§ã®ããã«ã人ã
ã¯
[
äœããã®çç±ã§
if
æ§æã®äžéšã§ãããšèããŸããããã¯çå®ã§ã¯ãããŸããïŒ
ã³ãã³ããååŸãã
if
ã ããã¯
[
ãããã¯
if
æ§æããŒã«ãŒã§ã¯ãªãã ãã®ã³ãã³ãã¯ãæåŸã®åŒæ°ã
]
ãªããã°ãªããªãããšãé€ããŠã
test
ãšåçã§ãã äŸïŒ
ãããã®è¡ã¯åçã§ããã©ã¡ãããfalseåŒæ°ã空ã§ãªãããšã確èªããŸãã ã©ã¡ãã®å ŽåããHELPãåºåãããŸããä»ã®èšèªããæ¥ãŠãã·ã§ã«æ§æãçè§£ããããšããŠããããã°ã©ããŒã®é©ãã§ãã
if
æ§æ
if
次ã®ãšããã§ãã
if COMMANDS then <COMMANDS> elif <COMMANDS>
ããäžåºŠ-
[
ã¯ããŒã ã§ãã 圌女ã¯ä»ã®æ®éã®ããŒã ã®ããã«è°è«ãåãåããŸãã
if
ã¯ãä»ã®ã³ãã³ããå«ãè€åã³ãã³ãã§ãã ãããŠ
ãã®æ§æã¯[ ïŒ
Bashã«ã¯çµã¿èŸŒã¿ã³ãã³ã
[
ããããŸãããããã£ãŠã
[
ã
]
ã«ã€ããŠã¯äœãç¹å¥ãªããšã¯ãããŸããã Bashã¯ã³ãã³ããžã®åŒæ°ãšããŠ
]
ãæž¡ãã ãã§ãããã³ãã³ãã¯æåŸã®åŒæ°ã§ããå¿
èŠããããŸããããã§ãªãå Žåãã¹ã¯ãªããã¯èŠèŠãããªããŸãã
0å以äžã®ãªãã·ã§ã³ã®
elif
ã»ã¯ã·ã§ã³ãšã1ã€ã®ãªãã·ã§ã³ã®
else
ã»ã¯ã·ã§ã³ãããå Žåããã
else
ã
è€å
if
ã³ãã³ãã«
ã¯ãã³ãã³ãã®
ãªã¹ããé
眮ããã2ã€ä»¥äžã®ã»ã¯ã·ã§ã³ãå«ãŸããŸãã åã»ã¯ã·ã§ã³ã¯ãããŒã¯ãŒã
then
ã
elif
ãŸãã¯
else
ã§å§ãŸããããŒã¯ãŒã
fi
çµãããŸãã æåã®ã»ã¯ã·ã§ã³ãšåŸç¶ã®å
elif
ã»ã¯ã·ã§ã³ã®æåŸã®ã³ãã³ãã®å®äºã³ãŒãã¯ã察å¿ããå
then
ã»ã¯ã·ã§ã³ã®èšç®ã決å®ããŸãã ä»ã®
elif
ã»ã¯ã·ã§ã³ã¯ã
then
1ã€ãå®è¡ãããåã«è©äŸ¡ãããŸãã
then
ã»ã¯ã·ã§ã³ãèšç®ãããªãå Žåã
else
ãã©ã³ããžã®åãæ¿ããçºçããŸãã
else
ããªãå Žåã
if
ãããã¯ã¯å®äºããçµæã®
if
ã³ãã³ãã¯0ïŒtrueïŒãè¿ããŸãã
grep
åºåã«å¿ããŠæ±ºå®ãè¡ãããå Žåã¯ãæ¬åŒ§ãè§æ¬åŒ§ãããã¯ãã£ãã¯ããŸãã¯ãã®ä»ã®æ§æã§å²ãå¿
èŠã¯ãããŸããïŒ
if
åŸã«ã³ãã³ããšããŠ
grep
ã䜿çšããŸãã
if grep -q fooregex myfile; then ... fi
grep
ã
myfile
ã®æååã§äžèŽãæ€åºããå Žåãå®äºã³ãŒãã¯0ïŒtrueïŒã«ãªãã
then
éšåãå®è¡ãããŸãã äžèŽãããã®ãèŠã€ãããªãå Žåã
grep
ã¯0以å€ã®å€ãè¿ããçµæã®
if
ã³ãã³ãã¯ãŒãã«ãªããŸãã
ãŸãèªãïŒ10. if [bar = "$ foo"]; ãã®åŸ...
[bar="$foo"]
åã®ç« ã§èª¬æããããã«ã
[
ã¯ã³ãã³ãã§ãïŒããã¯
type -t [
ãŸãã¯
whence -v [
ïŒ
type -t [
ã§èšŒæã§ããŸãã ä»ã®åçŽãªã³ãã³ããšåæ§ã«ãBashã¯ã¹ããŒã¹ãããã«ç¶ãããšãæåŸ
ããæ¬¡ã«æåã®åŒæ°ãã¹ããŒã¹ãããäžåºŠããªã©ãšæåŸ
ããŸãã ã¹ããŒã¹ãç¡èŠããããšã¯ã§ããŸããïŒ æ£ããã¹ãã«ã¯æ¬¡ã®ãšããã§ãã
if [ bar = "$foo" ]; then ...
åã³ã³ããŒãã³ãïŒ
bar
ã
=
ã眮æã
$foo
ããããã³
]
ïŒã¯ã
[
ã , , .
11. if [ [ a = b ] && [ c = d ] ]; then ...
.
[
. ,
if
- «», .
[
. -
if
Bash-, !
, :
if [ a = b ] && [ c = d ]; then ...
,
if
,
&&
( AND, ). , :
if test a = b && test c = d; then ...
test
false,
if
. true,
test
; true,
if
. (C-
&&
. Bash
. ,
||
OR .)
[[
&&
, :
if [[ a = b && c = d ]]; then ...
6 ,
test
.
12. read $foo
$
read
.
foo
, :
read foo
:
IFS= read -r foo
read $foo
/
$foo
. ,
foo
; .
13. cat file | sed s/foo/bar/ > file
. , , :
- (clobbered) ( 0 , , ),
- ,
- , , .
, , .
printf %s\\n ',s/foo/bar/g' wq | ed -s file
, (*) .
:
sed 's/foo/bar/g' file > tmpfile && mv tmpfile file
GNU sed 4.x:
sed -i 's/foo/bar/g' file(s)
, â .
- Perl 5.x (, , , GNU sed 4.x):
perl -pi -e 's/foo/bar/g' file(s)
Bash FAQ #21 .
(*)
sponge
moreutils :
sed '...' file | grep '...' | sponge file
mv
, «» ( !) ,
file
. , , , .
+ mv
/ . ,
mv
sync
.
14. echo $foo
.
$foo
, , . - Bash- , , . .
msg=", *.zip" echo $msg
, (glob) ( *.zip) . , :
, freenfss.zip lw35nfss.zip
. ã€ã©ã¹ãïŒ
var="*.zip"
,
echo
. , ,
-n
,
echo
, , . â
printf
:
printf "%s\n" "$foo"
15. $foo=bar
,
$
, . Perl.
16. foo = bar
,
=
, . .
foo = bar
, . â
foo
â . â .
foo= bar # !
foo =bar # !
$foo = bar; # !
foo=bar # .
foo="bar" # .
17. echo <<EOF
Here- â . . ,
echo
stdin.
. . . , ,
cat
, :
printf
, \ . ( ).
\n
printf
. \ . , , «» :
printf %s \ 'Hello world ' printf %s 'Hello world '
18. su -c 'some command'
. ,
su
-c
, , . OpenBSD:
$ su -c 'echo hello' su: only the superuser may specify a login class
-c 'some command'
,
-c
.
su root -c 'some command'
su
root-, . , . .
19. cd /foo; bar
cd
,
bar
. , , ,
bar
rm -f *
.
cd
. :
cd /foo && bar
cd
, :
cd /foo || exit 1 bar baz bat ...
cd
, stderr- «bash: cd: /foo: No such file or directory». stdout , :
cd /net || { echo >&2 "Can't read /net. Make sure you've logged in to the Samba network, and try again."; xit 1; } do_stuff more_stuff
,
{
echo
.
}
;
ã
set -e , , , . ( , ).
, Bash-,
pushd
,
popd
dirs
. , ,
cd
pwd
, . :
find ... -type d -print0 | while IFS= read -r -d '' subdir; do here=$PWD cd "$subdir" && whatever && ... cd "$here" done
C :
find ... -type d -print0 | while IFS= read -r -d '' subdir; do (cd "$subdir" || exit; whatever; ...) done
cd
. , ,
cd
. ,
... && ...
, . ( ).
20. [ bar == "$foo" ]
==
POSIX-
[
.
=
[[
.
[ bar = "$foo" ] && echo yes [[ bar == $foo ]] && echo yes
Bash
[ "$x" == y ]
, . â «» (
Bashism ). ,
[[
.
21. for i in {1..10}; do ./something &; done
;
&
.
;
ã
for i in {1..10}; do ./something & done : for i in {1..10}; do ./something & done
&
(command terminator),
;
ã .
,
;
,
;
ã
22. cmd1 && cmd2 || cmd3
-
&&
||
if ... then ... else ... fi
. :
[[ -s $errorlog ]] && echo "Uh oh, there were some errors." || echo "Successful."
if ... fi
. ,
&&
, . «true» (0), ,
||
ã äŸïŒ
i=0 true && ((i++)) || ((i--)) echo $i
ããã§äœãèµ·ãã£ãŠããŸããïŒ ,
i
1, 0. ?
i++
,
i--
.
((i++))
, . 0 (
i
), , 0,
false .
((i++))
(
i
0) 1 (false),
((i--))
.
, ,
++i
true:
i=0 true && (( ++i )) || (( --i )) echo $i
.
x && y || z
, y ! ,
i
-1 0.
, , - , ,
if ... fi
.
i=0 if true; then ((i++)) else ((i--)) fi echo $i
Bourne:
true && { echo true; false; } || { echo false; true; }
«true» «false», «true».
23. echo «Hello World!»
Bash ( 4.3), :
bash: !": event not found
, , Bash (history expansion) csh, . , . , «» :
$ echo "hi\!" hi\!
â
histexpand
.
set +H
set +o histexpand
:
: histexpand
, ?
, mp3info -t "Don't Let It Show" ... mp3info -t "Ah! Leah!" ...
, . . , , . . , ~/.bashrc. --
GreyCat:
echo 'Hello World!'
ãŸãã¯
set +H echo "Hello World!"
ãŸãã¯
histchars=
set +H
set +o histexpand
~/.bashrc
, . , , .
:
exmark='!' echo "Hello, world$exmark"
Bash 4.3 ,
!
. ,
echo "Hello World!"
, :
echo "Hello, World!(and the rest of the Universe)" echo "foo!'bar'"
24. for arg in $*
Bash ( Bourne-) , .
$*
,
$@
. , . :
for arg in "$@"
,
for arg
for arg in "$@"
.
"$@"
â , ( ). 99% .
äŸïŒ
:
25. function foo()
, .
function
()
. Bash ( ) . (, zsh 4.x , , ).
function foo
, :
foo() { ... }
26. echo "~"
, '~' . echo stdout '~', . , , $HOME, '~'. , $HOME â "/home/my photos".
"~/dir with spaces"
27. local varname=$(command)
,
local
. . , (
$?
) , . . :
local varname varname=$(command) rc=$?
.
28. export foo=~/bar
, â â
( ). ,
=
.
export
local
. ( Bash)
export foo=~/bar
, ( dash) â .
foo=~/bar; export foo
29. sed 's/$foo/good bye/'
$foo
. â
$
. :
foo="hello"; sed "s/$foo/good bye/"
: escapes. «
».
30. tr [AZ] [az]
. :
[AZ]
[az]
. , , . , . , 3 .
:
tr
. , '[' '[', - AZ az, ']' ']'. , .
, , AZ az 26 ASCII-. z ! , :
, .
31. ps ax | grep gedit
, . gedit. - , gedit ( ). ,
. PID gedit (),
$ ps ax | grep gedit 10530 ? S 6:23 gedit 32118 pts/0 R+ 0:00 grep gedit
,
Race Condition , grep. :
ps ax | grep -v grep | grep gedit
:
ps ax | grep '[g]edit'
Grep ,
[g]edit
,
grep
gedit
.
GNU/Linux âC :
$ ps -C gedit PID TTY TIME CMD 10530 ? 00:06:23 gedit
,
pgrep
?
$ pgrep gedit 10530
PID
awk
cut
:
$ ps -C gedit | awk '{print $1}' | tail -n1
ps
:
$ ps -C gedit -opid= 10530
1992
pgrep
, ,
pidof
( GNU/Linux):
$ pidof gedit 10530
PID, ,
pkill
. , , ,
pgrep/pkill ssh
sshd, .
, . , Firefox firefox-bin. , ,
ps ax | grep firefox . pgrep:
$ pgrep -fl firefox 3128 /usr/lib/firefox/firefox 7120 /usr/lib/firefox/plugin-container /usr/lib/flashplugin-installer/libflashplayer.so -greomni /usr/lib/firefox/omni.ja 3128 true plugin
. çå£ã«ã
32. printf "$foo"
, .
$foo
,
\
%
. :
printf %s "$foo" printf '%s\n' "$foo"
33. for i in {1..$n}
Bash .
$n
, , . , runtime. :
for ((i=1; i<=n; i++)); do ... done
for
, , (pre-expands), .
34. if [[ $foo = $bar ]] ( )
,
=
[[, Bash , .
bar
*,
true. , :
if [[ $foo = "$bar" ]]
, , , . .
,
=~
,
, . .
35. if [[ $foo =~ 'some RE' ]]
, . , , :
re='some RE' if [[ $foo =~ $re ]]
=~
Bash. .
[[
:
[[ $foo = "*.glob" ]]
36. [ -n $foo ] or [ -z $foo ]
[
,
.
$foo
0 , 42 , , 1, .
[ -n "$foo" ] [ -z "$foo" ] [ -n "$( - "$file")" ]
37. [[ -e "$broken_symlink" ]] 1 $broken_symlink
Test symlink', , symlink , â , , , â
test âe
1, symlink. ( ), :
38. ed file <<<«g/d\{0,3\}/s//e/g»
, ed 0 \{0,3\}. , :
ed file <<<"g/d\{1,3\}/s//e/g"
, POSIX-, BRE ( , ed),
0 (. 5) .
39. (sub-string) expr «match»
âŠ
word=abcde expr "$word" : ".\(.*\)" bcde
«match»
word=match expr "$word" : ".\(.*\)"
, «match» â . GNU '+'
word=match expr + "$word" : ".\(.*\)" atch
expr
. , , (
Parameter Expansion ). , ? POSIX- (Substring Expansion):
$ word=match $ echo "${word#?}"
,
expr
, Solaris POSIX
/bin/sh
. , , . , , , .
40. UTF-8 (Byte-Order Marks, BOM)
: Unix UTF-8 BOM. , MIME- . BOM UTF-8, , ( - ) , , , . , BOM, , , MS-DOS.
: , UTF-8 8- , BOM , , ASCII-, "#!" Unix-».
http://unicode.org/faq/utf_bom.html#bom541. content=$(<file)
, , ( :
`...`
,
$(...)
,
$(<file)
,
`<file`
${ ...; }
(ksh)) . , , , , , , . , : .
absolute_dir_path_x=$(readlink -fn -- "$dir_path"; printf x) absolute_dir_path=${absolute_dir_path_x%x}
, :
read
.
,
read
false, NUL-, . â
PIPESTATUS
. NUL-,
read
true,
pipefail
.
set -o pipefail { readlink -fn -- "$dir_path"; printf '\0x'; } | IFS= read -rd '' absolute_dir_path
: Bash
pipefail
PIPESTATUS
, ksh93 â
pipefail
, mksh
pipefail
, â
PIPESTATUS
. , ksh93,
read
NUL-.
42. for file in ./*; do if [[ $file != *.* ]]
, (. 3).
./
.
*.*
,
./filename
. . , (, , ), :
[[ $file != ./*.* ]]
, .
â
--
( 3).
shopt -s nullglob for file in *; do [[ $file != *.* ]] && rm -- "$file" done
43. somecmd 2>&1 >>logfile
, , , , stdout stderr. , stderr . , ,
. , . : « , (tty), -». . tty. :
somecmd >>logfile 2>&1
,
Copy BashGuide â redirection .
44. cmd; ((! $? )) || die
$?
, . , ( ), , :
if cmd; then ... fi
:
cmd status=$? case $status in 0) echo success >&2 ;; 1) echo 'Must supply a parameter, exiting.' >&2 exit 1 ;; *) echo "Unknown error $status, exiting." >&2 exit "$status" esac
45. y=$(( array[$x] ))
POSIX (arithmetic expansion)
( ), (array subscript) . , , .
$ x='$(date >&2)'
:
$ y=$((array["$x"])) Mon Jun 2 10:51:03 EDT 2014
:
46. read num; echo $((num+1))
(.
BashFAQ/054 ), num , .
$ echo 'a[$(echo injection >&2)]' | bash -c 'read num; echo $((num+1))' injection 1
47. IFS=, read -ra fields <<< "$csv_line"
, POSIX
IFS (field terminator), . , , :
$ IFS=, read -ra fields <<< "a,b," $ declare -p fields declare -a fields='([0]="a" [1]="b")'
? (« »). Bash, . :
$ IFS=, read -ra fields <<< "a,b,c" $ declare -p fields declare -a fields='([0]="a" [1]="b" [2]="c")'
? , IFS- . , IFS- «» , . , IFS- , , .
$ input="a,b," $ IFS=, read -ra fields <<< "$input," $ declare -p fields declare -a fields='([0]="a" [1]="b" [2]="")'
48. export CDPATH=.:~/myProject
CDPATH. CDPATH .bashrc , , Bash- sh-,
cd
, . . , :
cd some/dir || exit cmd to be run in some/dir
./some/dir
~/myProject/some/dir
, , .
cd
, , , .
â
cd
, :
output=$(cd some/dir && some command)
CDPATH ,
cd
stdout
/home/user/some/dir
, , CDPATH,
some command
.
CDPATH, ,
./
.
unset CDPATH
, , , CDPATH.