Shell脚本常见问题

1.定义变量时, =号的两边不可以留空格.

gender=femal										#right
gender =femal										#wrong
gender= femal										#wrong

2.条件测试语句 [ 符号的两边都要留空格.

if [ $gender = femal ]; then						#right
	echo “you are femal”;
fi

if[ \$gender...										#wrong
if [\$gender...										#wrong

3.条件测试的内容,如果是字符串比较的话, 比较符号两边要留空格!

if [ $gender = femal ]; then						#right.
if [ $gender= femal ]; then							#wrong.
if [ $gender=femal ]; then							#wrong.

4.如果if 和 then写在同一行, 那么,注意, then的前面要跟上 ; 号.如果 then 换行写, 那么也没问题.

if [ $gender = femal ]; then				 		#right.
if [ $gender = femal ]
then												#right.
if [ $gender = femal ] then							#wrong. then前面少了 ; 号.
#提示出错信息:
#syntax error near unexpected token then
#同理,还有很多出错信息 比如
#syntax error near unexpected token fi 等都是这样引起的.

5 .if 后面一定要跟上 then. 同理
elif 后面一定要跟上 then.
不然提示出错信息:
syntax error near unexpected token else
1)if 语句后面需要跟着then,同时前面要有分号;
2) 空格非常重要,*shell 会认为空格前的为一个命令*,如a=3是赋值操作,如果写成a= 3,那么就会认为a为一个命令
this=ls -l |grep ‘^-' | wc -l
3) 操作符之间要用空格分开 ,如 test ! -d $1,其中的!和-d就要用空格分开
空格是命令解析中的重要分隔符

6 . 命令和其后的参数或对象之间一定要有空格
if [ -x “~/Workspace/shell/a.sh” ];then
只有 -x 后有空格才表示紧跟其后的字符串是否指向一个可执行的文件名,否则就成了测试-x"~/Workspace/shell/a.sh" 这个字符串是不是空。

7.取变量值的符号’$'和后边的变量或括号不能有空格

8.可以直接在终端中使用echo $?获得if的测试结果,如判断变量$BB是否为空字符串:

BB=MM
[ -n "$BB" ]
echo $?

如果条件为真,则返回0;如果条件为假,则返回1(或者非0)。

也可以使用
test -n “$BB” && echo “yes”
如果条件为真,则输出yes

9.if判断

-z:字符串为空
-n${ROOT}”字符串不为空
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真 
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真 
-w filename 如果 filename可写,则为真 
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
filename1 -nt filename2 如果 filename1比 filename2新,则为真。
filename1 -ot filename2 如果 filename1比 filename2旧,则为真。
-eq 等于(适用于整形数字,=既适用字符串,也适用数字)
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
至于!号那就是取非

10 “. filename.sh” 相当于脚本中的include

11 .字符串处理
假设我们定义了一个变量为:

file=/dir1/dir2/dir3/my.file.txt

可以用${ }分别替换得到不同的值:

${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 /  及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 .  及其左边的字符串:file.txt
${file##*.}:删掉最后一个 .  及其左边的字符串:txt
${file%/*}:删掉最后一个  /  及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 /  及其右边的字符串:(空值)
${file%.*}:删掉最后一个  .  及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个  .   及其右边的字符串:/dir1/dir2/dir3/my

记忆的方法为:

# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2

也可以对变量值里的字符串作替换:

${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt

利用 ${ } 还可针对不同的变数状态赋值(沒设定、空值、非空值):

${file-my.file.txt} :假如 $file 沒有设定,則使用 my.file.txt 作传回值。(空值及非空值時不作处理) 
${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值。 (非空值時不作处理)
${file+my.file.txt} :假如 $file 設為空值或非空值,均使用 my.file.txt 作傳回值。(沒設定時不作处理)
${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設定及空值時不作处理)
${file=my.file.txt} :若 $file 沒設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (空值及非空值時不作处理)
${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值為my.file.txt 。 (非空值時不作处理)
${file?my.file.txt} :若 $file 沒設定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時不作处理)

${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR。 (非空值時不作处理)
${#var} 可计算出变量值的长度:
${#file} 可得到 27 ,因为/dir1/dir2/dir3/my.file.txt 是27个字节

12 . shell里 "` " 意义
命令替换`command` 结构使字符 “`” 引住的命令执行结果能赋值给一个变量。它也被称为后引号(backquotes)或是斜引号(backticks)【译者注:这个字符不是单引号,而是在标准美国键盘上的ESC键下面,在字符1左边,在TAB键上面的那个键,要特别留心】。

13 .一般-a与&&等效,-o与||等效
14 .在[[command]]中的命令,进行算数扩展,能用正则表达式,与或运算使用&&和||;但是[command],命令不支持算数扩展,运算需要使用$(1+99),不支持正则,与或使用-a和-o 。

14.文件格式的问题
一般windows下编写的文档都是dos格式的,换行符为\r\n,直接放在linux下运行的脚本会报错,可以使用dos2unix工具转换
或者在NotePad++下操作:编辑->文档格式转换->转为UNIX格式

15.Heredoc
编写HereDoc的语法采用以下形式:

[COMMAND] <<[-] 'DELIMITER'
  HERE-DOCUMENT
DELIMITER

如:

cat <<- EOF
	Line with a leading tab.
EOF
  • 第一行以可选命令开头,后跟特殊重定向运算符<<和分隔标识符。
    – 您可以使用任何字符串作为分隔标识符,最常用的是EOF或END。
    – 如果分隔标识符未加引号,则在将here-document行传递给命令之前,shell将替换所有变量,命令和特殊字符。
    – 将减号添加到重定向运算符<< - 将导致忽略所有前导制表符。 这允许您在此处写入时使用缩进 - shell脚本中的文档。 不允许使用前导空白字符,只允许使用制表符。
    – here-document块可以包含字符串,变量,命令和任何其他类型的输入。
  • 最后一行以分隔标识符结束。分隔符前的空白是不允许的。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值