고급 Bash 스 크 립 트 프로 그래 밍 가이드 (19): 내부 명령 과 내장 명령 (2)
19974 단어 shell
성공 과 견지 는 그 치지 않 는 다
파일 시스템
cd
cd, 디 렉 터 리 명령 을 수정 합 니 다. 스 크 립 트 에서 가장 많이 사용 할 때 명령 이 지정 한 디 렉 터 리 에서 실 행 될 때 현재 작업 디 렉 터 리 를 수정 해 야 합 니 다.
여 기 는 단지 비교적 특수 한 상황 을 제기 할 뿐, 아마도 너 는 이런 것들 을 자주 사용 하지 않 을 것 이다.
cd - 작업 디 렉 터 리 를 $OLDPWD, 즉 이전 작업 디 렉 터 리 로 수정 합 니 다.
root@haitao-VirtualBox:~# cd mysrc/
root@haitao-VirtualBox:~/mysrc# cd -
/root
root@haitao-VirtualBox:~# cd mysrc/
root@haitao-VirtualBox:~/mysrc# cd /root/myshare/
root@haitao-VirtualBox:~/myshare# cd -
/root/mysrc
root@haitao-VirtualBox:~/mysrc#
우리 가 두 개의 "/"를 cd 명령 의 매개 변수 로 사용 할 때 결 과 는 우리 의 예상 을 벗 어 났 다. 물론 하나의 "/"는 문제 가 없다.root@haitao-VirtualBox:~/mysrc# cd /
root@haitao-VirtualBox:/# cd
root@haitao-VirtualBox:~# cd //
root@haitao-VirtualBox://# pwd
//
root@haitao-VirtualBox://#
pwd
현재 작업 디 렉 터 리 를 출력 합 니 다. 이것 은 사용자 (또는 스 크 립 트) 의 현재 작업 디 렉 터 리 를 보 여 줍 니 다. 이 명령 을 사용 한 결 과 는 내장 변수 $PWD 에서 읽 은 값 과 같 습 니 다.
pushd, popd, dirs
이 명령 들 은 작업 디 렉 터 리 를 책 갈피 화 할 수 있 습 니 다. 순서대로 작업 디 렉 터 리 를 앞으로 이동 하거나 뒤로 이동 할 수 있 습 니 다. 스 택 을 누 르 는 동작 은 작업 디 렉 터 리 목록 을 저장 할 수 있 습 니 다. 옵션 을 선택 하면 디 렉 터 리 스 택 에 대해 다른 작업 을 할 수 있 습 니 다.
pushd dir - name 경로 dir - name 을 디 렉 터 리 스 택 에 누 르 고 현재 디 렉 터 리 를 dir - name 으로 수정 합 니 다.
popd 는 디 렉 터 리 스 택 의 맨 위 에 있 는 디 렉 터 리 를 팝 업 하 는 동시에 현재 디 렉 터 리 를 방금 팝 업 한 디 렉 터 리 로 변경 합 니 다.
dirs 는 모든 디 렉 터 리 스 택 의 내용 을 보 여 줍 니 다 ($DIRSTACK 변수 와 비교). 성공 적 인 pushd 나 popd 는 dirs 명령 을 자동 으로 호출 합 니 다.
현재 디 렉 터 리 에 하 드 인 코딩 을 하지 않 았 고 현재 작업 디 렉 터 리 를 유연 하 게 수정 해 야 하 는 스 크 립 트 에 대해 서 는 이 명령 을 사용 하 는 것 이 좋 습 니 다. $DIRSTACK 배열 변 수 를 만 드 는 것 을 주의 하 십시오. 이 변 수 는 스 크 립 트 에 접근 할 수 있 고 디 렉 터 리 스 택 의 내용 을 저장 합 니 다.
root@ubuntu:~/resource/shell-study/0614-2013# pushd `pwd`
~/resource/shell-study/0614-2013 ~/resource/shell-study/0614-2013
root@ubuntu:~/resource/shell-study/0614-2013# cd
root@ubuntu:~# popd
~/resource/shell-study/0614-2013
root@ubuntu:~/resource/shell-study/0614-2013# dirs
~/resource/shell-study/0614-2013
root@ubuntu:~/resource/shell-study/0614-2013#
현재 작업 디 렉 터 리 를 수정 하 는 실례 를 보십시오
#!/bin/bash
dir1=/usr/local
dir2=/var/spool
pushd $dir1
# 'dirs' ( stdout ).
echo "Now in directory `pwd`." # 'pwd'.
# 'dir1' .
pushd $dir2
echo "Now in directory `pwd`."
# 'dir2' .
echo "The top entry in the DIRSTACK array is $DIRSTACK."
popd
echo "Now back in directory `pwd`."
# , 'dir1' .
popd
echo "Now back in original working directory `pwd`."
exit 0
결과:root@ubuntu:~/resource/shell-study/0615-2013# chmod +x test1.sh
root@ubuntu:~/resource/shell-study/0615-2013# ./test1.sh
/usr/local ~/resource/shell-study/0615-2013
Now in directory /usr/local.
/var/spool /usr/local ~/resource/shell-study/0615-2013
Now in directory /var/spool.
The top entry in the DIRSTACK array is /var/spool.
/usr/local ~/resource/shell-study/0615-2013
Now back in directory /usr/local.
~/resource/shell-study/0615-2013
Now back in original working directory /root/resource/shell-study/0615-2013.
root@ubuntu:~/resource/shell-study/0615-2013#
어렵 지 않 아 요. 마음 을 가 라 앉 히 고 분석 해 보면 알 수 있어 요.변량
let
let 명령 은 변수의 산술 작업 을 수행 합 니 다. 많은 경우 복잡 한 expr 명령 의 간단 한 버 전 으로 여 겨 집 니 다.
"let"명령 을 사용 하여 산술 연산 을 하 는 실례
#!/bin/bash
echo
let a=11 # 'a=11'
let a=a+5 # let "a = a + 5"
# ( .)
echo "11 + 5 = $a" # 16
let "a <<= 3" # let "a = a << 3"
echo "\"\$a\" (=16) left-shifted 3 places = $a"
# 128
let "a /= 4" # let "a = a / 4"
echo "128 / 4 = $a" # 32
let "a -= 5" # let "a = a - 5"
echo "32 - 5 = $a" # 27
let "a *= 10" # let "a = a * 10"
echo "27 * 10 = $a" # 270
let "a %= 8" # let "a = a % 8"
echo "270 modulo 8 = $a (270 / 8 = 33, remainder $a)"
# 6
echo
exit 0
결과:root@ubuntu:~/resource/shell-study/0615-2013# chmod +x test2.sh
root@ubuntu:~/resource/shell-study/0615-2013# ./test2.sh
11 + 5 = 16
"$a" (=16) left-shifted 3 places = 128
128 / 4 = 32
32 - 5 = 27
27 * 10 = 270
270 modulo 8 = 6 (270 / 8 = 33, remainder 6)
root@ubuntu:~/resource/shell-study/0615-2013#
eval
eval arg1 [arg2] ... [argN]
표현 식 의 인자 나 표현 식 목록 을 조합 하여 평가 합 니 다. 표현 식 에 포 함 된 변 수 는 모두 확 장 됩 니 다. 결 과 는 명령 으로 전 환 됩 니 다. 명령 행 이나 스 크 립 트 에서 코드 를 만 들 려 면 이 명령 이 매우 유용 합 니 다.
root@ubuntu:~/resource/shell-study/0615-2013# process=xterm
root@ubuntu:~/resource/shell-study/0615-2013# show_process="eval ps ax | grep $process"
root@ubuntu:~/resource/shell-study/0615-2013# $show_process
30030 pts/0 S+ 0:00 grep --color=auto xterm
eval 명령 의 효 과 를 보 여 주 는 인 스 턴 스
#!/bin/bash
y=`eval ls -l` # y=`ls -l`
echo $y #+ , "echo" "" .
echo
echo "$y" # "" , .
echo; echo
y=`eval df` # y=`df`
echo $y #+ .
# LF( ) , "awk" ,
#+ .
echo
echo "==========================================================="
echo
# , "eval" " " . . .
for i in 1 2 3 4 5; do
eval value=$i
# value=$i , "eval" .
# -- ,
#+ , .
echo $value
done
echo
echo "---"
echo
for i in ls df; do
value=eval $i
# value=$i .
# "eval" "ls" "df" . . .
# "ls" "df" ,
#+ ,
#+ .
echo $value
done
exit 0
결과:root@ubuntu:~/resource/shell-study/0615-2013# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 19737268 7480724 11253948 40% /
none 508764 276 508488 1% /dev
none 512996 12 512984 1% /dev/shm
none 512996 120 512876 1% /var/run
none 512996 0 512996 0% /var/lock
none 512996 0 512996 0% /lib/init/rw
root@ubuntu:~/resource/shell-study/0615-2013# chmod +x test3.sh root@ubuntu:~/resource/shell-study/0615-2013# ./test3.sh total 12 -rwxr-xr-x 1 root root 508 2013-06-14 23:08 test1.sh -rwxr-xr-x 1 root root 693 2013-06-14 23:13 test2.sh -rwxr-xr-x 1 root root 1262 2013-06-14 23:24 test3.sh
total 12
-rwxr-xr-x 1 root root 508 2013-06-14 23:08 test1.sh
-rwxr-xr-x 1 root root 693 2013-06-14 23:13 test2.sh
-rwxr-xr-x 1 root root 1262 2013-06-14 23:24 test3.sh
Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 19737268 7480736 11253936 40% / none 508764 276 508488 1% /dev none 512996 12 512984 1% /dev/shm none 512996 120 512876 1% /var/run none 512996 0 512996 0% /var/lock none 512996 0 512996 0% /lib/init/rw
===========================================================
1
2
3
4
5
---
test1.sh test2.sh test3.sh
5
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 19737268 7480736 11253936 40% /
none 508764 276 508488 1% /dev
none 512996 12 512984 1% /dev/shm
none 512996 120 512876 1% /var/run
none 512996 0 512996 0% /var/lock
none 512996 0 512996 0% /lib/init/rw
5
root@ubuntu:~/resource/shell-study/0615-2013#
강제 로그 인 (log - of) 인 스 턴 스#!/bin/bash
# ppp log-off.
# root .
killppp="eval kill -9 `ps ax | awk '/ppp/ { print $1 }'`"
# -------- ppp ID -------
$killppp # .
# root .
chmod 666 /dev/ttyS3
# ppp SIGKILL ,
#+ .
rm /var/lock/LCK..ttyS3 # .
exit 0
eval 명령 은 위험 합 니 다. 더 적절 한 방법 으로 기능 을 수행 할 수 있다 면 사용 을 피하 십시오. eval $COMMANDS 는 명령 COMMANDS 의 내용 을 실행 합 니 다. 명령 에 rm - rf * 가 포함 되 어 있다 면 원 하 는 것 이 아 닐 수도 있 습 니 다. eval 명령 이 있 는 낯 선 사람 이 만 든 코드 세 션 을 실행 할 때,이것 은 매우 위험한 일이 다.set
set 명령 은 내부 스 크 립 트 변수의 값 을 수정 하 는 데 사 용 됩 니 다. 스 크 립 트 의 위치 변 수 를 설정 하 는 데 사용 할 옵션 플래그 위 치 를 터치 하여 스 크 립 트 의 행동 을 결정 하 는 데 도움 을 주 는 역할 을 합 니 다. 다른 역할 은 명령 의 결과 (set ` command ') 로 스 크 립 트 의 위치 변 수 를 다시 설정 하 는 것 입 니 다. 스 크 립 트 는 명령 의 출력 에서 위치 변 수 를 다시 분석 합 니 다.
스 크 립 트 의 위치 매개 변 수 를 set 명령 으로 변경 하 는 인 스 턴 스
#!/bin/bash
# 3 ,
# , "./test one two three".
echo
echo "Positional parameters before set \`uname -a\` :"
echo "Command-line argument #1 = $1"
echo "Command-line argument #2 = $2"
echo "Command-line argument #3 = $3"
set `uname -a` # `uname -a`
# .
echo $_ # unknown( : uname -a ,
# .)
# .
echo "Positional parameters after set \`uname -a\` :"
# $1, $2, $3, . `uname -a`
echo "Field #1 of 'uname -a' = $1"
echo "Field #2 of 'uname -a' = $2"
echo "Field #3 of 'uname -a' = $3"
echo ---
echo $_ # ---
echo
exit 0
결과:root@ubuntu:~/resource/shell-study/0615-2013# uname -a
Linux ubuntu 2.6.32-21-generic #32-Ubuntu SMP Fri Apr 16 08:10:02 UTC 2010 i686 GNU/Linux
root@ubuntu:~/resource/shell-study/0615-2013# ./test5.sh
Positional parameters before set `uname -a` :
Command-line argument #1 =
Command-line argument #2 =
Command-line argument #3 =
GNU/Linux
Positional parameters after set `uname -a` :
Field #1 of 'uname -a' = Linux
Field #2 of 'uname -a' = ubuntu
Field #3 of 'uname -a' = 2.6.32-21-generic
---
---
root@ubuntu:~/resource/shell-study/0615-2013#
root@ubuntu:~/resource/shell-study/0615-2013# ./test5.sh one two three
Positional parameters before set `uname -a` :
Command-line argument #1 = one
Command-line argument #2 = two
Command-line argument #3 = three
GNU/Linux
Positional parameters after set `uname -a` :
Field #1 of 'uname -a' = Linux
Field #2 of 'uname -a' = ubuntu
Field #3 of 'uname -a' = 2.6.32-21-generic
---
---
root@ubuntu:~/resource/shell-study/0615-2013#
반전 위치 인자 의 인 스 턴 스#!/bin/bash
set a\ b c d\ e;
# ^ ^
# ^ ^
echo "old IFS=$IFS"
OIFS=$IFS; IFS=:;
# ^ IFS, IFS.
echo "new IFS=$IFS"
echo
until [ $# -eq 0 ]
do # .
echo "### k0 = "$k"" #
k=$1:$k; # .
# ^
echo "### k = "$k"" #
echo
shift;
done
set $k # .
echo -
echo $# # .
echo -
echo
for i # "in list" ,
#+ -- i --.
do
echo $i # .
done
IFS=$OIFS # IFS.
exit 0
결과:root@ubuntu:~/resource/shell-study/0615-2013# chmod +x test6.sh
root@ubuntu:~/resource/shell-study/0615-2013# ./test6.sh
old IFS=
new IFS=:
### k0 =
### k = a b
### k0 = a b
### k = c a b
### k0 = c a b
### k = d e c a b
-
3
-
d e
c
a b
root@ubuntu:~/resource/shell-study/0615-2013#
set 명령 을 사용 하지 않 으 면 모든 환경 변수 와 초기 화 된 변 수 를 보 여 줍 니 다.root@ubuntu:~/resource/shell-study/0615-2013# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="5" [3]="1" [4]="release" [5]="i486-pc-linux-gnu")
BASH_VERSION='4.1.5(1)-release'
CLASSPATH=.:/usr/lib/jvm/java/jdk1.7.0_13/lib
COLORTERM=gnome-terminal
COLUMNS=85
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-NifSM3iDlO,guid=9ab993acd7e0b2bbecd0340551821d2e
DEFAULTS_PATH=/usr/share/gconf/gnome.default.path
DESKTOP_SESSION=gnome
DIRSTACK=()
DISPLAY=:0.0
EUID=0
GDMSESSION=gnome
GDM_KEYBOARD_LAYOUT=us
GDM_LANG=en_US.UTF-8
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GNOME_KEYRING_CONTROL=/tmp/keyring-0pB4Zz
GNOME_KEYRING_PID=1726
GROUPS=()
GTK_MODULES=canberra-gtk-module
HISTCONTROL=ignoredups:ignorespace
HISTFILE=/root/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/root
HOSTNAME=ubuntu
HOSTTYPE=i486
IFS=$' \t
'
JAVA_HOME=/usr/lib/jvm/java/jdk1.7.0_13
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=20
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:hl=44;37:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:'
MACHTYPE=i486-pc-linux-gnu
MAILCHECK=60
MANDATORY_PATH=/usr/share/gconf/gnome.mandatory.path
OLDPWD=/root/resource/shell-study
OPTERR=1
OPTIND=1
ORBIT_SOCKETDIR=/tmp/orbit-root
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/java/jdk1.7.0_13/bin:/opt/FriendlyARM/toolschain/4.4.3/bin
PIPESTATUS=([0]="0")
PPID=2090
PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
PS2='> '
PS4='+ '
PWD=/root/resource/shell-study/0615-2013
SESSION_MANAGER=local/ubuntu:@/tmp/.ICE-unix/1744,unix/ubuntu:/tmp/.ICE-unix/1744
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SPEECHD_PORT=6560
SSH_AGENT_PID=1779
SSH_AUTH_SOCK=/tmp/keyring-0pB4Zz/ssh
TERM=xterm
UID=0
USER=root
USERNAME=root
WINDOWID=59004342
XAUTHORITY=/var/run/gdm/auth-for-root-cUTmoG/database
XDG_CONFIG_DIRS=/etc/xdg/xdg-gnome:/etc/xdg
XDG_DATA_DIRS=/usr/share/gnome:/usr/local/share/:/usr/share/
XDG_SESSION_COOKIE=e2701cc9fa08772c6d472e6450b8b925-1367481646.513094-1041457640
_=three
process=xterm
show_process='eval ps ax | grep xterm'
command_not_found_handle ()
{
if [ -x /usr/lib/command-not-found ]; then
/usr/bin/python /usr/lib/command-not-found -- $1;
return $?;
else
if [ -x /usr/share/command-not-found ]; then
/usr/bin/python /usr/share/command-not-found -- $1;
return $?;
else
return 127;
fi;
fi
}
root@ubuntu:~/resource/shell-study/0615-2013#
매개 변 수 를 사용 하여 set 명령 을 호출 하면 위치 변 수 를 명확 하 게 할당 합 니 다. 만약 -- 옵션 뒤에 변수 이름과 함께 하지 않 으 면 모든 위치 변 수 를 unsets 로 만 듭 니 다.위치 매개 변 수 를 재배 치 하 는 인 스 턴 스
#!/bin/bash
variable="one two three four five"
set -- $variable
# "$variable" .
first_param=$1
second_param=$2
shift; shift # .
remaining_params="$*"
echo
echo "first parameter = $first_param" # one
echo "second parameter = $second_param" # two
echo "remaining parameters = $remaining_params" # three four five
echo; echo
# .
set -- $variable
first_param=$1
second_param=$2
echo "first parameter = $first_param" # one
echo "second parameter = $second_param" # two
# ======================================================
set --
# , unset .
first_param=$1
second_param=$2
echo "first parameter = $first_param" # (null value)
echo "second parameter = $second_param" # (null value)
exit 0
결과:root@ubuntu:~/resource/shell-study/0615-2013# chmod +x test7.sh
root@ubuntu:~/resource/shell-study/0615-2013# ./test7.sh
first parameter = one
second parameter = two
remaining parameters = three four five
first parameter = one
second parameter = two
first parameter =
second parameter =
root@ubuntu:~/resource/shell-study/0615-2013#
unset unset 명령 은 셸 변 수 를 삭제 하 는 데 사 용 됩 니 다. 이 명령 의 효 과 는 이 변 수 를 null 로 설정 하 는 것 입 니 다. 주의: 이 명령 은 위치 매개 변수 에 잘못 되 었 습 니 다.
bash$ unset PATH
bash$ echo $PATH
bash$
"Unset"변수의 인 스 턴 스#!/bin/bash
# unset.sh: Unset .
variable=hello # .
echo "variable = $variable"
unset variable # Unset.
# variable= .
echo "(unset) variable = $variable" # $variable null.
exit 0
결과:root@ubuntu:~/resource/shell-study/0615-2013# chmod +x test8.sh
root@ubuntu:~/resource/shell-study/0615-2013# ./test8.sh
variable = hello
(unset) variable =
root@ubuntu:~/resource/shell-study/0615-2013#
export
export 명령 은 export 의 변 수 를 실행 중인 스 크 립 트 (또는 셸) 의 모든 하위 프로 세 스에 사용 할 수 있 습 니 다. 불 행 히 도 부모 프로 세 스에 변 수 를 export 할 수 없습니다. 부모 프로 세 스 는 이 스 크 립 트 의 스 크 립 트 나 셸 을 호출 하 는 것 입 니 다. export 명령 에 대한 중요 한 용법 은 시작 파일 에서 환경 변 수 를 초기 화하 고 설정 하 는 데 사 용 됩 니 다.이렇게 해야만 사용자 프로 세 스 가 환경 변수 에 접근 할 수 있다.
declare, typeset
declare 와 typeset 명령 은 변수의 속성 을 지정 하거나 제한 하 는 데 사 용 됩 니 다.
readonly
declare - r 와 같은 역할 을 합 니 다. 변수의 읽 기 전용 속성 을 설정 하거나 이 변 수 는 상수 라 고 생각 할 수 있 습 니 다. 이러한 속성 을 설정 한 후에 수정 하려 면 잘못된 정 보 를 얻 을 수 있 습 니 다. 이러한 상황 은 C 언어의 const 상수 형식 과 같 습 니 다.
getopts
이 명령 은 스 크 립 트 에 전 달 된 명령 행 인 자 를 분석 하 는 가장 강력 한 도구 라 고 할 수 있 습 니 다. 이 명령 은 외부 명령 getopt, 그리고 C 언어 에 있 는 라 이브 러 리 함수 getopt 의 역할 과 같 습 니 다. 스 크 립 트 에 여러 옵션 을 전달 하고 연결 할 수 있 으 며 여러 개의 참 수 를 스 크 립 트 에 할당 할 수 있 습 니 다 (예 를 들 어 scriptname - abc - e/usr/local).
getopts 구 조 는 두 개의 함 축 된 변 수 를 사용 합 니 다. $OPTIND 는 매개 변수 포인터 (옵션 색인) 와 $OPTARG (옵션 매개 변수) (선택 가능 한) 는 옵션 뒤에 매개 변 수 를 추가 할 수 있 습 니 다. 성명 탭 에서 옵션 이름 뒤의 사칭 은 이 옵션 이름 에 매개 변수 가 할당 되 었 음 을 알려 줍 니 다.
getopts 구 조 는 보통 하나의 while 순환 에 그룹 을 구성 하고 순환 과정 에서 매번 하나의 옵션 과 파 라 메 터 를 처리 한 다음 에 변수 $OPTIND 의 값 을 추가 하여 다음 처 리 를 합 니 다.
1. 명령 행 을 통 해 스 크 립 트 에 전 달 된 인자 앞 에 마이너스 (-) 를 추가 해 야 합 니 다. - 접두사 입 니 다. 그러면 getopts 명령 은 이 인 자 를 옵션 으로 봅 니 다. 사실 getopts 는 접두사 가 없 는 인 자 를 처리 하지 않 습 니 다. 첫 번 째 인자 가 없 으 면 - 옵션 의 처 리 를 끝 냅 니 다.
2. getopts 의 while 순환 템 플 릿 은 표준 while 순환 템 플 릿 과 다 르 고 표준 순환 중의 괄호 [] 판단 조건 이 없습니다.
3. getopts 구 조 는 외부 명령 getopt 를 대체 합 니 다.
먼저 여기까지, O (∩ ∩) O ~
내 칼럼 주소:http://blog.csdn.net/column/details/shell-daily-study.html
계속
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZSH에서 물고기까지ZSH는 수년 동안 내 기본 셸이었습니다. 이제 몇 달 동안 사용하면서 ZSH 구성에 대해 몇 가지 사항을 발견했습니다. 우리는 을 제공하는 시스템과 더 빨리 상호 작용하는 경향이 있습니다. 내.zshrc 구성에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.