ä½ç½®ãã©ã¡ã¼ã¿ã«ã¤ãã¦ã
bashã®ä½¿ãæ¹ ã®ã·ãªã¼ãºãä»åã¯ãä½ç½®å¤æ°ï¼ä½ç½®ãã©ã¡ã¼ã¿ï¼ã«ã¤ãã¦è¦ã¦ããããã¨æãã¾ãã
弿°ããªãã·ã§ã³ã¨ãã¦ä½¿ããã人ã¯ãâ getopts ã®è¨äºãåèã«ãã¦ãã ãã
ããã§ã¯ãbash ã®å¼æ°ã¸é åã¨ãã¦ã¢ã¯ã»ã¹ãã¦é¢æ°ãã¹ã¯ãªããã§ã©ãæ±ãããèãã¦ããã¾ãã
弿°ã®ãã¨ã¯ãpositinal parameter ã»ä½ç½®ãã©ã¡ã¿ã¨ãã¦æ±ããã¾ãã
弿°ï¼ä½ç½®ãã©ã¡ã¼ã¿ã¨ã¯
ä½ç½®ãã©ã¡ã¼ã¿ã¯ãbashã«ã¯ positional parameter ã¨æ¸ããã¦ãã¾ããä½ç½®å¤æ°ã»ä½ç½®ãã©ã¡ã¼ã¿ã»ãã¸ã·ã§ãã«ãã©ã¡ã¼ã¿ãªã©ã¨å¼ã¶ãã¨ãæãã¾ãã
ä½ç½®ãã©ã¡ã¼ã¿ãä¸è¨ã§è¨ãã°ãã弿°ãæ ¼ç´ããé åãã®ãã¨ã§ãã
ä½ç½®ãã©ã¡ã¼ã¿ã¯é å
é åã ãã©ãã¡ãã£ã¨ç¹æ®ãªé åã§ãååãããã¾ãããç¡åãªé åã§ãã
颿°ã®å¼æ°ãã·ã§ã«ã¹ã¯ãªããã®å¼æ°ã«ä½¿ãããã®ã§ããã¡ãã¡ååãã¤ãã¦ãªãã¨ãããã¨ãããã§ãã
ä½ç½®ãã©ã¡ã¼ã¿ã®ãµã³ãã«ï¼ã·ã§ã«ã¹ã¯ãªãã
ä½ç½®ãã©ã¡ã¼ã¿ãã©ã®ããã«ä½¿ãã®ãå°ãè¦ã¦ããããã¨ãæãã¾ãã
ä½ç½®ãã©ã¡ã¼ã¿ãæ±ãä¾
#!/usr/bin/env bash echo $0 echo $1 echo $2 echo $3
ä¸è¨ãå®è¡ããçµæ
$ bash sample01.sh a1 a2 a3 sample01.sh a1 a2 a3
ä½ç½®ãã©ã¡ã¼ã¿ã¸ã®ã¢ã¯ã»ã¹
ä½ç½®ãã©ã¡ã¼ã¿ã¯ååã®ãªãé åãªã®ã§ãé åååã®ç®æãçç¥ããã¨ã¦ããããããªæ¸ãæ¹ãã§ãã¦ããã¨ããã¤ã³ãã§ãã
夿° | æå³ |
---|---|
$0 | å®è¡ä¸ã®ãã¡ã¤ã«å |
$1 | ï¼çªãã®å¤æ° |
$2 | ï¼çªãã®å¤æ° |
$N | ï¼®çªãã®å¤æ°(0-9)ã ã |
${N} | ï¼®çªãã®å¤æ°ã10çªä»¥éã¯å¿ é |
$@ | $1..$N ã¾ã§ã®å¼æ°é åãã¹ã¦ |
$* | $@ã¨åãããã ãIFSåºåã |
$# | é ååæ°ï¼ã¤ã¾ã弿°ã®åæ° |
${@: X: n} | xçªç®ããNåã®ã¹ã©ã¤ã¹ |
ãã ãã10çªç®ä»¥é㯠$10
ã $1 0
ã¨è§£éããã¦ãã¾ãã®ã§ã${10}
ã®ããã«ãã¬ã¤ã¹ã§å²ãå¿
è¦ãããã¾ãã
ã¾ãã$@
ã®é
å㯠$1..$N
ã¾ã§ã§ã$0
ã¯å«ã¾ãã¾ããã
ãã¡ããé
åãªã®ã§ã¹ã©ã¤ã¹ã§é¨åé
åãåãåºãäºã
ã§ãã¾ãã
颿°ã»ã·ã§ã«ã¹ã¯ãªããã®å¼æ°ã®éã
颿°ã¨ã·ã§ã«ã¹ã¯ãªããã§ã¯ã弿°ã®æ±ãã¯ã»ã¼åãã§ãããï¼ç¹ã ãæ³¨ç®ãã¹ãéããæãã¾ããããã¯$0
ã®éãã§ãã
颿°ã®ä¾ sample02.sh
function my_func(){ echo $FUNCNAME echo $0 } sample02
sample02.sh ã®å®è¡çµæ
$ bash sample02.sh my_func sample02.sh
颿°ã¨ã·ã§ã«ã¹ã¯ãªããã®éã
颿°ä¸ã§ãã$0
ã¯ é¢æ°ã®æ¸ããã¦ãããã¡ã¤ã«åã§ãã
ã·ã§ã«ã¹ã¯ãªããã§ã¯ã$0
ã¯èªåèªèº«ã®ãã¡ã¤ã«åã«ãªãã¾ãã
ãã颿°ä¸ã§ãèªåã®ååãå¿
è¦ãªã¨ã㯠$FUNCNAME
ãåç
§ãã¾ãã
ãã¨ãinteractive shell (RPEL)ã§å®è¡ä¸ã¯ bash ã«ãªãã¾ãã
ä½ç½®å¤æ°ã¯ï¼ããå§ã¾ãããã¡ã ãã«ãã¨è¦ãã¦ããã¨ä¾¿å©ãªã®ããããã¾ããã
ã·ã§ã«ã§å®è¡ãã¦ããå ´å
$ function sample02(){ > echo $FUNCNAME > echo $0 > } $ sample02 sample02 -bash
ååãããã¾ããããååã¯ããã¾ãã
ä½ç½®ãã©ã¡ã¼ã¿ã«ã¯ååãããã¾ããããããããããããã«ååãã¤ãã¦ã¢ã¯ã»ã¹ãããã¨ãåºæ¥ã¾ãã
ããããæ¬¡ã®å ´åã® arg
ã§ãã
èªåã§å¥åã®å¤æ°ã«ä¿åãã¦ãããã¨ãåºæ¥ã¾ãã
ä½ç½®ãã©ã¡ã¼ã¿ãã«ã¼ããã
ä½ç½®ãã©ã¡ã¼ã¿ã ãã«è¨±ãããè¨æ³ãããã¾ãããããã¨ã¦ãç°¡ä¾¿ãªæ¹æ³ã§ãã
ä½ç½®ãã©ã¡ã¼ã¿ç¹æã®for
for arg; do echo $arg done
ã¨ããããããããã£ã¦ç°¡ä¾¿ã«ARGVãå ¨é¨åããæ¹æ³ããããã¨ãç¥ã£ã¦ããã¨ããã¨æãã¾ãã
ããã®ä»çµã¿ã¯ãçç¥è¨æ³ã§ããargã¯åãªã夿°åã§ã夿°åã¯ãªãã§ã大ä¸å¤«ã§ãã
for i ; do echo $i; done
ãã¡ãã for .. in
ã for (( i=1;i<max;i++)) ;
ã§ã«ã¼ãããã®ãããã¨æãã¾ãã*1
弿°ããã¹ã¦ããªããªãã¾ã§å¦ç
ãã¡ã¤ã«åãè¤æ°åã§å¼æ°ã¨ãã¦ååããããã鿬¡å¦çãããããªå ´åã«ã¯ä¸è¨ã®ãããªã«ã¼ãæ§é ã便å©ã§ãã forã§ã¯ãã©ãã¾ã§é²ãã ãããããªããªãããã®ãã弿°ããã¥ã¼çã«ä½¿ããã»ãã便å©ã§ãã
å¤ãããã®å
人㯠shift
ã使ã£ã¦ãå¦çãããã¨ãããããã§ãã
while ã«ã¼ãã§ããã ãåã
while [ "$1" ] do echo "$1" shift done
ããã¯ã$1
ãå
é ãªã®ãå©ç¨ãã¦ãã¾ãã$1 ã使ãçµãã£ãã shift
ã§$@
ãé²ãã¦ãã¾ãã
shift
ã¯å¼æ°ï¼ä½ç½®ãã©ã¡ã¼ã¿ï¼ãå¦çããã¨æé»çã«æ±ºãããã¦ãã¾ãã
ä¸ã®ã³ã¼ããä¸ã¤ãã¤è¦ã¦ããã¨æ¬¡ã®ã¨ããã§ãã
while [ "$1" ]
çµäºæ¡ä»¶ ã$1 ã空ã§ãªãã¨ãecho $1
$1 ãåºåããshift
弿°ãä¸ã¤ãããã
ãããã¯ãshift
㯠shift $@
ã®ã®æå³ã ã¨æããããã¦ãã¾ãã
ä½ç½®ãã©ã¡ã¼ã¿ã使ãã¨ã«ã¼ããã·ã³ãã«ã«ãªãã
while : ; do shift
ã for arg
ã®ããã« ä½ç½®ãã©ã¡ã¼ã¿ç¹æã®è¨è¿°æ¹æ³ããããã¨ã§ããããå¦çãææ©ãçµãããããããããã«ãªã£ã¦ãã¾ãã
bash ã®ã·ã§ã«ã¹ã¯ãªããã¨é¢æ°ã¯ãã¤ããä¸å®åãã®å¼æ°ãåããã¨ã«ãªã£ã¦ãã¾ãããã®ãããã«ã¼ãã¯ããã ãåãã®ãåºæ¬ã«ãªã£ã¦ãã¾ããä»ã®ããã°ã©ãã³ã°è¨èªã颿°ãä¸ç¨®ã®åã®ããã«æ±ãã弿°ã¨æ»ãå¤ãå³å¯ã«æ±ºãã¦ãããã¨ã¨ã¯å¤§ããç°ãªãã¾ãã
ä½ç½®ãã©ã¡ã¼ã¿ãèªåã§ä½ããªãã®ï¼
ãã®ãããªä¾¿å©ãªä½ç½®ãã©ã¡ã¼ã¿ã§ãããèªåã§ä½ããªãã®ã§ããããã
é åãå¦çããã¨ãã«ãä½ç½®ãã©ã¡ã¼ã¿ã使ããã¨ä¾¿å©ããã§ããããã¯åºæ¥ã¾ãã
set
ã使ãã¾ãã
set ã使ãã°ãä½ç½®ãã©ã¡ã¼ã¿ããã®å ´ã§å¥½ããªé åï¼æååï¼ã«ä¸æ¸ããããã¨ãåºæ¥ã¾ãã
set ã®ä½¿ç¨ä¾
set I like youtube. set "he hates youtube." # ã¯ãªã¼ãã
set ã§å²ããã¨ã§ãå²ã£ãé¨åãé åã«å±éããpositional parameter ã«å±éãããã¨ãåºæ¥ã¾ãã
ä½ç½®ãã©ã¡ã¼ã¿ãèªåã§ä½¿ã ãµã³ãã«
set I like youtube. for arg; do echo $arg done
ãµã³ãã«ã®å®è¡çµæ
takuya@Desktop$ set I like youtube. takuya@Desktop$ for arg; do > echo $arg > done I like youtube.
set ã§ä½ç½®ãã©ã¡ã¼ã¿ã使ãã¨ãã®æ³¨æ
set ããã¦ãã¾ãã¨ãã¹ã¯ãªããã颿°ã®ãã¨ãã¨ã®å¼æ°ã¯ä¸æ¸ãããã¾ãã
ãªããªããã®ç©ºéã§ä½¿ããä½ç½®ãã©ã¡ã¼ã¿ã¯ï¼ã¤ã ããã§ããããã¯åç¡ã夿°ãªã®ã§ä»æ¹ã®ãªããã¨ã§ãã
set ãåããã°ãfunction ã®å¼æ°ãçè§£ã§ããã
set ã®ä½¿ãæ¹ãããã£ãã®ã§ã颿°ã¨è¦æ¯ã¹è¦ãã¨ã
颿°ã®å¼æ°ã¯ãã®ç©ºéã§set ãã¦ããã ãã ã¨çè§£ã§ãããã§ãã
function sample () { # ããã¯setæ¸ã¿ããè¦ããªã } sample a1 a2 a3 # ããã§ å¼æ°string "a1 a2 a3"ãset ãã¦ãã
弿°ãè§£æãã
弿°ã¯é åã§ãã¡ãã£ã¨ç¹æ®ãªé åã§ãä½ç½®ãã©ã¡ã¼ã¿ã¨ãããã¨ããããã¾ããã
ããã§è¦ãããã¨ã使ã£ã¦ããã°ããããããªå¼æ°å¦çã¯ããæ¸ããã¨ãåºæ¥ã¾ãã
弿°ãããã¨ãã¯å¼æ°ãããªãã¨ãã¯STDINããèªã
弿°ã§æ¸¡ããããã³ãã³ãããæ¸¡ãããã両æ¹ã«å¯¾å¿ã§ããã·ã§ã«ã¹ã¯ãªãããä½ãã¾ããã
# STDINã弿°ãã©ã¡ããåãã«ä½¿ããä¾
if (( $# > 0 )); then echo $@ else echo $( cat - ) fi
ä¸è¨ã®å®è¡ä¾ã
takuya@Desktop$ bash test.sh abc CTRL+D abc takuya@Desktop$ bash test.sh aaa aaa
cat ã®å ¥å㯠CTRL+D ( EOF ) ã§å ¥åçµäºã§ããã®ã§ãå®éå ¥åããã¨ãã¯CTRL+Dã§å ¥åãçµäºãã¦ãã ããã
弿°ã®å¦çã使ã£ã¦ã³ãã³ããªãã·ã§ã³ãå¦çãã
-a
ã -b
ã®ããã«æå®ãããªãã·ã§ã³ãæ¥ãã¨ãã ãå¦çããã¦ãã以å¤ãæ¨ã¦ããã¨ãåºæ¥ã¾ãã
while : do case "$1" in -f | --file) file="$2" # You may want to check validity of $2 shift 2 ;; -*) echo "Error: Unknown option: $1" >&2 exit 1 ;; *) # No more options break ;; esac done
ããã§ while :
ã® :
ä½ãããªãtrueãè¿ãã³ãã³ãã§ãããªã®ã§ç¡éã«ã¼ãã§ããå
é¨ã§shift ã exit /brek ããã¦ããã®ã§ã弿°ãããã ãã«ã¼ããã¾ãã
ã¤ã¾ãããã®ã¹ã¯ãªããã¯ã以ä¸ã®ãããªå¦çããããã¨ãåºæ¥ãããã«ãªãã¾ãã
sample -f a.txt -f b.txt -f c.txt
ãªãã·ã§ã³ã®è§£æã¯ getopts
ãã£ã¨ç´°ãããªãã·ã§ã³ã®è§£æãããã«ã¯ getopts ã使ãã¾ãã
getopts ã¯ã·ã§ã«çµè¾¼ã¿é¢æ°ã§ãã¤ã§ã使ãã¾ãããã«ã㯠help getopts
ã§è¦ããã¨ãåºæ¥ã¾ãã
ç§ãéå»ã«ç´¹ä»ãã¦ããã®ã§ããã¡ããåèã«ãã¦ãã ãã
ã¡ãªã¿ã«ãgetopt 㯠/usr/bin/getoptã§ãã
2016-12-28
if ã®æ¡ä»¶ããæå忝è¼ã«ãªã£ã¦ãã®ã§ãæ°å¤æ¯è¼ã«ç´ãã
é¢é£è³æ
åèè³æ
- http://wiki.bash-hackers.org/scripting/posparams#the_first_argument
- http://wiki.bash-hackers.org/howto/getopts_tutorial
*1: è£è¶³ã§ãã for e in $@ ã§åããã¨ãã $0 ã¯åºã¦ãã¾ãã