当前位置: 技术问答>linux和unix
linux shell编程中$符号问题
来源: 互联网 发布时间:2016-05-16
本文导语: 一下是linux下的service脚本,有几个地方有点点疑问,请各位高手指点下。 1.第15行的echo $"${USAGE}",如果是我写的话,直接写echo $USAGE,请问这前者有什么优点呢? 2.第32行cd ${SERVICEDIR},如果是我写的话,直接写cd $SE...
一下是linux下的service脚本,有几个地方有点点疑问,请各位高手指点下。
1.第15行的echo $"${USAGE}",如果是我写的话,直接写echo $USAGE,请问这前者有什么优点呢?
2.第32行cd ${SERVICEDIR},如果是我写的话,直接写cd $SERVICEDIR,请问前者有什么优点?
3.第66行echo $"${SERVICE}: unrecognized service", 如果是我写的话,我直接写
echo "$SERVICE: unrecognized service",请问前者有什么优点?
1 #!/bin/sh
2
3 # Set up a default search path.
4 PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"
5 export PATH
6
7 VERSION="`basename $0` ver. 0.91"
8 USAGE="Usage: `basename $0` | --status-all |
9 [ service_name [ command | --full-restart ] ]"
10 SERVICE=
11 SERVICEDIR="/etc/init.d"
12 OPTIONS=
13
14 if [ $# -eq 0 ]; then
15 echo $"${USAGE}" >&2
16 exit 1
17 fi
18
19 cd /
20 while [ $# -gt 0 ]; do
21 case "${1}" in
22 --help | -h | --h* )
23 echo $"${USAGE}" >&2
24 exit 0
25 ;;
26 --version | -V )
27 echo $"${VERSION}" >&2
28 exit 0
29 ;;
30 *)
31 if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then
32 cd ${SERVICEDIR}
33 for SERVICE in * ; do
34 case "${SERVICE}" in
35 functions | halt | killall | single| linuxconf| kudzu |
36 *rpmorig | *rpmnew | *rpmsave | *~ | *.orig)
37 ;;
38 *)
39 if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
40 env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" status
41 fi
42 ;;
43 esac
44 done
45 exit 0
46 elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then
47 SERVICE="${1}"
48 if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
49 env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" stop
50 env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" start
51 exit $?
52 fi
53 elif [ -z "${SERVICE}" ]; then
54 SERVICE="${1}"
55 else
56 OPTIONS="${OPTIONS} ${1}"
57 fi
58 shift
59 ;;
60 esac
61 done
62
63 if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
64 env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" ${OPTIONS}
65 else
66 echo $"${SERVICE}: unrecognized service" >&2
67 exit 1
68 fi
1.第15行的echo $"${USAGE}",如果是我写的话,直接写echo $USAGE,请问这前者有什么优点呢?
2.第32行cd ${SERVICEDIR},如果是我写的话,直接写cd $SERVICEDIR,请问前者有什么优点?
3.第66行echo $"${SERVICE}: unrecognized service", 如果是我写的话,我直接写
echo "$SERVICE: unrecognized service",请问前者有什么优点?
1 #!/bin/sh
2
3 # Set up a default search path.
4 PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"
5 export PATH
6
7 VERSION="`basename $0` ver. 0.91"
8 USAGE="Usage: `basename $0` | --status-all |
9 [ service_name [ command | --full-restart ] ]"
10 SERVICE=
11 SERVICEDIR="/etc/init.d"
12 OPTIONS=
13
14 if [ $# -eq 0 ]; then
15 echo $"${USAGE}" >&2
16 exit 1
17 fi
18
19 cd /
20 while [ $# -gt 0 ]; do
21 case "${1}" in
22 --help | -h | --h* )
23 echo $"${USAGE}" >&2
24 exit 0
25 ;;
26 --version | -V )
27 echo $"${VERSION}" >&2
28 exit 0
29 ;;
30 *)
31 if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then
32 cd ${SERVICEDIR}
33 for SERVICE in * ; do
34 case "${SERVICE}" in
35 functions | halt | killall | single| linuxconf| kudzu |
36 *rpmorig | *rpmnew | *rpmsave | *~ | *.orig)
37 ;;
38 *)
39 if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
40 env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" status
41 fi
42 ;;
43 esac
44 done
45 exit 0
46 elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then
47 SERVICE="${1}"
48 if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
49 env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" stop
50 env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" start
51 exit $?
52 fi
53 elif [ -z "${SERVICE}" ]; then
54 SERVICE="${1}"
55 else
56 OPTIONS="${OPTIONS} ${1}"
57 fi
58 shift
59 ;;
60 esac
61 done
62
63 if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
64 env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" ${OPTIONS}
65 else
66 echo $"${SERVICE}: unrecognized service" >&2
67 exit 1
68 fi
|
其实就和宏定义中的()一样 防止意外的组合
|
A double-quoted string preceded by a dollar sign (‘$’) will cause
the string to be translated according to the current locale. If the
current locale is C or POSIX, the dollar sign is ignored. If the
string is translated and replaced, the replacement is double-quoted.
cd ${SERVICEDIR} 和 cd $SERVICEDIR 没啥区别,加 {} 的作用体现在
像 "${SERVICE}: unrecognized service" 这种字符串中的替换,可以进行分组,不会出现意外
|
我觉得是一个习惯的问题。
具体简单的例子:
LIBNAME=libxxx
cp ${LIBNAME}.so . #这里的{}就是必需的,不然它会把$LIBNAME.so认为${LIBNAME}
还有当你知道了shell只接收$1, $9参数之后,你就更容易理解了:
$10在shell中被解释为 ${1}0
良好的习惯还有一个好处就是在不同的shell版本之间兼容。
具体简单的例子:
LIBNAME=libxxx
cp ${LIBNAME}.so . #这里的{}就是必需的,不然它会把$LIBNAME.so认为${LIBNAME}
还有当你知道了shell只接收$1, $9参数之后,你就更容易理解了:
$10在shell中被解释为 ${1}0
良好的习惯还有一个好处就是在不同的shell版本之间兼容。
|
cp ${LIBNAME}.so . #这里的{}就是必需的,不然它会把$LIBNAME.so认为${LIBNAME}
更正一下:
cp ${LIBNAME}.so . #这里的{}就是必需的,不然它会把$LIBNAME.so认为${LIBNAME.so}
更正一下:
cp ${LIBNAME}.so . #这里的{}就是必需的,不然它会把$LIBNAME.so认为${LIBNAME.so}