shell a-z意义
[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则为真。
[ -s FILE ] 如果 FILE 存在且大小不为o则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。
[ -z STRING ] “STRING” 的长度为零则为真。
[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。
[ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。
[ STRING1 != STRING2 ] 如果字符串不相等则为真。
[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。
[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。
[ -z “echo 111s|sed 's/[0-9]//g'” ] && echo 1 || echo 0 #把字符串中的数字都替换掉
BASH_SOURCE[0]
BASH_SOURCE[0] BASH_SOURCE[0] 等价于 BASH_SOURCE, 取得当前执行的shell文件所在的路径及文件名。
看例子
[root@controller ~]# pwd
/root
[root@controller ~]# cat test.sh
if [ -z $OCTAVIA_REPO_PATH ]; then
AMP_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
echo 变量AMP_DIR的值是: $AMP_DIR
fi
[root@controller ~]# sh test.sh
变量AMP_DIR的值是: /root
%/*和
直接看例子
[root@controller ~]# pwd
/root
[root@controller ~]# cat test.sh
if [ -z $OCTAVIA_REPO_PATH ]; then
AMP_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
OCTAVIA_REPO_PATH=${OCTAVIA_REPO_PATH:-${AMP_DIR%/*}}
OCTAVIA_REPO_PATH2=${OCTAVIA_REPO_PATH2:-${AMP_DIR#*/}}
echo 变量AMP_DIR的值是: $AMP_DIR
echo 变量OCTAVIA_REPO_PATH的值是: $OCTAVIA_REPO_PATH
echo 变量OCTAVIA_REPO_PATH2的值是: $OCTAVIA_REPO_PATH2
fi
[root@controller ~]# sh test.sh
变量AMP_DIR的值是: /root
变量OCTAVIA_REPO_PATH的值是:
变量OCTAVIA_REPO_PATH2的值是: root
[root@controller ~]# cat ceshi/test.sh
if [ -z $OCTAVIA_REPO_PATH ]; then
AMP_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
OCTAVIA_REPO_PATH=${OCTAVIA_REPO_PATH:-${AMP_DIR%/*}}
OCTAVIA_REPO_PATH2=${OCTAVIA_REPO_PATH2:-${AMP_DIR#*/}}
echo 变量AMP_DIR的值是: $AMP_DIR
echo 变量OCTAVIA_REPO_PATH的值是: $OCTAVIA_REPO_PATH
echo 变量OCTAVIA_REPO_PATH2的值是: $OCTAVIA_REPO_PATH2
fi
[root@controller ~]# sh ceshi/test.sh
变量AMP_DIR的值是: /root/ceshi
变量OCTAVIA_REPO_PATH的值是: /root
变量OCTAVIA_REPO_PATH2的值是: root/ceshi
#代表删除从前往后最小匹配的内容
%代表删除从后往前最小匹配的内容
getopts
选项之间可以通过冒号:进行分隔,也可以直接相连接,选项:表示选项后面必须带有参数(比如a:表示a后边必须跟参数),如果没有可以不加实际值进行传递。
当optstring以”:”开头时,getopts会区分invalid option错误和miss option argument错误。
invalid option时,varname会被设成?,
O
P
T
A
R
G
是
出
问
题
的
o
p
t
i
o
n
;
m
i
s
s
o
p
t
i
o
n
a
r
g
u
m
e
n
t
时
,
v
a
r
n
a
m
e
会
被
设
成
:
,
OPTARG是出问题的option; miss option argument时,varname会被设成:,
OPTARG是出问题的option;missoptionargument时,varname会被设成:,OPTARG是出问题的option。
如果optstring不以”:“开头,invalid option错误和miss option argument错误都会使varname被设成?,$OPTARG是出问题的option。
例子1
[root@controller ~]# cat test.sh
while getopts "a:b:c:d" opt; do
case $opt in
a) echo "this is -a arg value is $OPTARG";;
b) echo "this is -b arg value is $OPTARG";;
c) echo "this is -c arg value is $OPTARG";;
d) echo "this is -d arg value is $OPTARG";;
\?) echo "Invalid option: -$OPTARG";;
\:) echo "miss option argument: -$OPTARG";;
esac
done
[root@controller ~]# sh test.sh -a
test.sh: 选项需要一个参数 -- a
Invalid option: -
[root@controller ~]# sh test.sh -a openstack
this is -a arg value is openstack
[root@controller ~]# sh test.sh -a openstack -b
this is -a arg value is openstack
test.sh: 选项需要一个参数 -- b
Invalid option: -
[root@controller ~]# sh test.sh -a openstack -b octavia
this is -a arg value is openstack
this is -b arg value is octavia
[root@controller ~]# sh test.sh -a openstack -b octavia -c -d
this is -a arg value is openstack
this is -b arg value is octavia
this is -c arg value is -d
例子2
[root@controller ~]# cat test2.sh
while getopts "abcd" opt; do
case $opt in
a) echo "this is -a arg value is $OPTARG";;
b) echo "this is -b arg value is $OPTARG";;
c) echo "this is -c arg value is $OPTARG";;
d) echo "this is -d arg value is $OPTARG";;
\?) echo "Invalid option: -$OPTARG";;
\:) echo "miss option argument: -$OPTARG";;
esac
done
[root@controller ~]# sh test2.sh -a
this is -a arg value is
[root@controller ~]# sh test2.sh -a openstack
this is -a arg value is
[root@controller ~]# sh test2.sh -a openstack -b
this is -a arg value is
[root@controller ~]# sh test2.sh -a -b
this is -a arg value is
this is -b arg value is
[root@controller ~]# sh test2.sh -a -b -c
this is -a arg value is
this is -b arg value is
this is -c arg value is
[root@controller ~]# sh test2.sh -a -b -c -d
this is -a arg value is
this is -b arg value is
this is -c arg value is
this is -d arg value is
例子3
[root@controller ~]# cat test3.sh
while getopts ":a:b:c:d:" opt; do
case $opt in
a) echo "this is -a arg value is $OPTARG";;
b) echo "this is -b arg value is $OPTARG";;
c) echo "this is -c arg value is $OPTARG";;
d) echo "this is -d arg value is $OPTARG";;
\?) echo "Invalid option: -$OPTARG";;
\:) echo "miss option argument: -$OPTARG";;
esac
done
[root@controller ~]# sh test3.sh -a
miss option argument: -a
[root@controller ~]# sh test3.sh -b
miss option argument: -b
[root@controller ~]# sh test3.sh -a openstack
this is -a arg value is openstack
[root@controller ~]# sh test3.sh -a openstack -b
this is -a arg value is openstack
miss option argument: -b
[root@controller ~]# sh test3.sh -a openstack -b -d
this is -a arg value is openstack
this is -b arg value is -d
[root@controller ~]# sh test3.sh -a openstack -b -d --d
this is -a arg value is openstack
this is -b arg value is -d
Invalid option: --
miss option argument: -d
shift ( ( (( ((OPTIND - 1))
由于 O P T I N D 总 是 存 储 原 始 OPTIND 总是存储原始 OPTIND总是存储原始*中下一个要处理的元素位置,程序运行到这句话的时候,指针后面的参数还都是没有处理过的,而指针前的参数已经全部处理过了。通过 shift ( ( (( ((OPTIND - 1)) 的处理,$*中就只保留了除去选项内容的参数(未处理过的参数),可以在其后进行正常的shell编程处理了。
[root@controller ~]# cat test.sh
echo "输入的参数为: $*"
while getopts ":a:b:c:" opt
do
case $opt in
a ) echo "选项a的值为: $OPTARG"
echo "下一个要处理的参数位置为: $OPTIND";;
b ) echo "选项b的值为: $OPTARG"
echo "下一个要处理的参数的位置为: $OPTIND";;
c ) echo "选项c的值为: $OPTARG"
echo "下一个要处理的参数的位置为: $OPTIND";;
? ) echo "error"
exit 1;;
: ) echo "error"
exit 1;;
esac
done
echo "处理到的参数位置为$OPTIND"
shift $(($OPTIND - 1))
echo "脚本文件名为: $0"
echo "未处理过的参数为: $*"
[root@controller ~]# sh test.sh -a 12 -bc 34 1009 122 dadad dada
输入的参数为: -a 12 -bc 34 1009 122 dadad dada
选项a的值为: 12
下一个要处理的参数位置为: 3
选项b的值为: c
下一个要处理的参数的位置为: 4
处理到的参数位置为4
脚本文件名为: test.sh
未处理过的参数为: 34 1009 122 dadad dada
[root@controller ~]# sh test.sh -a 12 -b 34 -c 1009 122 dadad dada
输入的参数为: -a 12 -b 34 -c 1009 122 dadad dada
选项a的值为: 12
下一个要处理的参数位置为: 3
选项b的值为: 34
下一个要处理的参数的位置为: 5
选项c的值为: 1009
下一个要处理的参数的位置为: 7
处理到的参数位置为7
脚本文件名为: test.sh
未处理过的参数为: 122 dadad dada
var=${var:-“value”}
举例
CLOUD_INIT_DATASOURCES=${CLOUD_INIT_DATASOURCES:-"ConfigDrive"}
表示CLOUD_INIT_DATASOURCES这个变量的默认值为ConfigDrive。
if [ $var ]
表示变量存在并且有值则为真。
[root@controller ~]# cat test.sh
OCTAVIA_ELEMENTS_PATH=/root/ceshi
if [ "$DIB_LOCAL_ELEMENTS_PATH" ]; then
export ELEMENTS_PATH=$OCTAVIA_ELEMENTS_PATH:$DIB_LOCAL_ELEMENTS_PATH
else
export ELEMENTS_PATH=$OCTAVIA_ELEMENTS_PATH
fi
echo $ELEMENTS_PATH
[root@controller ~]# sh test.sh
/root/ceshi
[root@controller ~]# cat test.sh
OCTAVIA_ELEMENTS_PATH=/root/ceshi
DIB_LOCAL_ELEMENTS_PATH=/tmp
if [ "$DIB_LOCAL_ELEMENTS_PATH" ]; then
export ELEMENTS_PATH=$OCTAVIA_ELEMENTS_PATH:$DIB_LOCAL_ELEMENTS_PATH
else
export ELEMENTS_PATH=$OCTAVIA_ELEMENTS_PATH
fi
echo $ELEMENTS_PATH
[root@controller ~]# sh test.sh
/root/ceshi:/tmp
[root@controller ~]# cat test.sh
OCTAVIA_ELEMENTS_PATH=/root/ceshi
DIB_LOCAL_ELEMENTS_PATH=
if [ "$DIB_LOCAL_ELEMENTS_PATH" ]; then
export ELEMENTS_PATH=$OCTAVIA_ELEMENTS_PATH:$DIB_LOCAL_ELEMENTS_PATH
echo "true"
else
export ELEMENTS_PATH=$OCTAVIA_ELEMENTS_PATH
echo "false"
fi
echo $ELEMENTS_PATH
[root@controller ~]# sh test.sh
false
/root/ceshi
shell中的变量 $VAR 与 ${VAR}区别
$VAR
最好VAR在定义的时候,采用VAR=“abcdefg” 这种带引号的定义。
${VAR}
这种写法比较规范,VAR在定义的时候,采用VAR=abcdefg 这种不带引号的定义也没有关系。
pushd
1)功能
pushd命令常用于将目录加入到栈中,加入记录到目录栈顶部,并切换到该目录;若pushd命令不加任何参数,则会将位于记录栈最上面的2个目录对换位置
2)语法
(1)格式:pushd [目录 | -N | +N] [-n]
(2)选项
目录 将该目录加入到栈顶,并执行"cd 目录",切换到该目录
+N 将第N个目录移至栈顶(从左边数起,数字从0开始)
-N 将第N个目录移至栈顶(从右边数起,数字从0开始)
-n 将目录入栈时,不切换目录
示例
[root@controller ~]# pushd /tmp/
/tmp ~
[root@controller tmp]#