고급 Bash 스 크 립 트 프로 그래 밍 가이드 (19): 내부 명령 과 내장 명령 (2)

19974 단어 shell
고급 Bash 스 크 립 트 프로 그래 밍 가이드 (19): 내부 명령 과 내장 명령 (2)
성공 과 견지 는 그 치지 않 는 다
파일 시스템
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
계속

좋은 웹페이지 즐겨찾기