Shell脚本常见问题

编程入门 行业动态 更新时间:2024-10-28 02:31:17

Shell脚本<a href=https://www.elefans.com/category/jswz/34/1769387.html style=常见问题"/>

Shell脚本常见问题

1.定义变量时, =号的两边不可以留空格.
eg:
gender=femal————right
gender =femal———–wrong
gender= femal———–wrong

2.条件测试语句 [ 符号的两边都要留空格.
eg:
if [ $gender = femal ]; then——-right.
echo “you are femal”;
fi

if[ $gender…-----------------------wrong
if [$gender…----------------------wrong.

3.条件测试的内容,如果是字符串比较的话, 比较符号两边要留空格!
eg:
if [ $gender = femal ]; then——-right.
if [ $gender= femal ]; then——–wrong.
if [ $gender=femal ]; then———wrong.

4.如果if 和 then写在同一行, 那么,注意, then的前面要跟上 ; 号.如果 then 换行写, 那么也没问题.
eg:
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.可以直接在终端中使用

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

获得if的测试结果,判断变量$BB是否为空字符串;
如果条件为真,则返回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 <<- EOFLine with a leading tab.
EOF
  • 第一行以可选命令开头,后跟特殊重定向运算符<<和分隔标识符。
    – 您可以使用任何字符串作为分隔标识符,最常用的是EOF或END。
    – 如果分隔标识符未加引号,则在将here-document行传递给命令之前,shell将替换所有变量,命令和特殊字符。
    – 将减号添加到重定向运算符<< - 将导致忽略所有前导制表符。 这允许您在此处写入时使用缩进 - shell脚本中的文档。 不允许使用前导空白字符,只允许使用制表符。
    – here-document块可以包含字符串,变量,命令和任何其他类型的输入。
  • 最后一行以分隔标识符结束。分隔符前的空白是不允许的。

更多推荐

Shell脚本常见问题

本文发布于:2023-06-30 14:17:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/961707.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:常见问题   脚本   Shell

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!