Shell特殊语法

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会被设成:, OPTARGoptionmissoptionargumentvarname: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]# 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Cshell(C shell)是一种Unix shell(Unix外壳程序),它提供了一种与操作系统交互的方式,允许用户运行命令和控制系统。以下是Cshell的基本语法: 1. 命令执行: 在Cshell中,您可以直接输入命令来执行。例如,输入`ls`命令可以列出当前目录的文件和子目录。 2. 变量: 您可以使用变量来存储和访问数据。变量名通常以美元符号(`$`)开头。例如,`$name`表示变量`name`的值。 3. 环境变量: 环境变量是Cshell中的特殊变量,用于存储系统相关的信息。您可以使用`setenv`命令设置环境变量的值。例如,`setenv PATH /usr/local/bin:$PATH`设置了环境变量`PATH`的值。 4. 输入/输出重定向: 使用输入/输出重定向,您可以将命令的输入或输出从标准位置改变到文件或其他设备。例如,`command > file.txt`将命令的输出重定向到名为`file.txt`的文件中。 5. 管道: 管道允许将一个命令的输出作为另一个命令的输入。通过使用竖线(`|`)符号,您可以将多个命令连接起来。例如,`command1 | command2`将`command1`的输出作为`command2`的输入。 6. 条件语句: Cshell支持条件语句,使您可以根据条件执行不同的命令。例如,使用`if`语句可以根据条件来执行一些操作。 7. 循环: 使用循环结构,您可以重复执行一系列命令。Cshell支持`while`循环和`for`循环。例如,使用`for`循环可以遍历一个列表并执行相应的操作。 这些是Cshell的基本语法。它提供了强大的命令行控制和脚本编程功能,可以帮助您在Unix系统上执行各种任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空无限

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值