当前位置:   article > 正文

【Linux】Shell相关-美元符号的多种用法_shell脚本赋值时添加¥是什么意思

shell脚本赋值时添加¥是什么意思

总结一哈

  1. $0 shell的命令本身(包括完整路径)
  2. $1$9 数字表示shell 的第几个参数
  3. $# 传递到脚本的参数个数
  4. $* 以一个单字符串显示所有向脚本传递的参数
  5. $$ 脚本运行的ID号
  6. $! 后台运行的最后一个进程的ID号
  7. $@ 与$*相同。
  8. $- 显示shell使用的当前选项。
  9. $? 显示最后命令的执行状况。0表示没有错误。
  1. [qingxu@v020170 /tmp]$ ./test.sh p1 p2
  2. $0 is { ./test.sh }
  3. $1 is { p1 }
  4. $2 is { p2 }
  5. $* is { p1 p2 }
  6. $@ is { p1 p2 }
  7. $# is { 2 }
  8. $! is { }
  9. $$ is { 25643 }
  10. $? is { 0 }

 来自:Linux Shell中的美元符号$


 

目录

运行shell脚本

定义变量、使用变量与删除变量

Shell 字符串

Shell 数组

多行注释

shell传递参数

Shell 基本运算符

字符串运算符

Shell echo命令

for循环

Shell 脚本中 '$' 符号的多种用法 

Linux常用命令:将文件夹内所有文件的路径写入.txt文件

shell中的冒号作用 !!!!!!


  • 运行shell脚本

1、作为可执行程序

将上面的代码保存为 test.sh,并 cd 到相应目录:

  1. chmod +x ./test.sh #使脚本具有执行权限
  2. ./test.sh #执行脚本

注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。

  • 定义变量、使用变量与删除变量

定义变量,变量名和等号之间不能有空格;

使用变量,使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

  1. your_name="qinjx"
  2. echo $your_name
  3. echo ${your_name}
  4. # 两个echo都可以print出qinjx

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。

注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符($)。

删除变量,使用 unset 命令可以删除变量

  1. #!/bin/sh
  2. myUrl="https://www.runoob.com"
  3. unset myUrl
  4. echo $myUrl
  5. # 以上实例执行将没有任何输出
  • Shell 字符串

单引号

str='this is a string'

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号

  1. your_name='runoob'
  2. str="Hello, I know you are \"$your_name\"! \n"
  3. echo -e $str
  4. # 结果为
  5. Hello, I know you are "runoob"!

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

拼接字符串

  1. your_name="runoob"
  2. # 使用双引号拼接
  3. greeting="hello, "$your_name" !"
  4. greeting_1="hello, ${your_name} !"
  5. echo $greeting $greeting_1
  6. # 使用单引号拼接
  7. greeting_2='hello, '$your_name' !'
  8. greeting_3='hello, ${your_name} !'
  9. echo $greeting_2 $greeting_3
  10. # 结果为
  11. hello, runoob ! hello, runoob !
  12. hello, runoob ! hello, ${your_name} !

获取字符串长度

  1. string="abcd"
  2. echo ${#string} #输出 4

 提取子字符串,以下实例从字符串第 2 个字符开始截取 4 个字符:

  1. string="runoob is a great site"
  2. echo ${string:1:4} # 输出 unoo
  3. 注意:第一个字符的索引值为 0。

查找子字符串,查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):

  1. string="runoob is a great site"
  2. echo `expr index "$string" io` # 输出 4
  3. 注意: 以上脚本中 ` 是反引号,而不是单引号 '
  • Shell 数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

定义数组

  1. array_name=(value0 value1 value2 value3)
  2. array_name=(
  3. value0
  4. value1
  5. value2
  6. value3
  7. )
  8. array_name[0]=value0
  9. array_name[1]=value1
  10. array_name[n]=valuen
  11. # 可以不使用连续的下标,而且下标的范围没有限制。

读取数组元素值的一般格式是:${数组名[下标]}

  1. valuen=${array_name[n]}
  2. 使用 @ 符号可以获取数组中的所有元素,例如:
  3. echo ${array_name[@]}

获取数组长度的方法与获取字符串长度的方法相同,例如:

  1. # 取得数组元素的个数
  2. length=${#array_name[@]}
  3. # 或者
  4. length=${#array_name[*]}
  5. # 取得数组单个元素的长度
  6. lengthn=${#array_name[n]}

 实例

  1. my_array=(A B "C" D)
  2. echo "第一个元素为: ${my_array[0]}"
  3. echo "第二个元素为: ${my_array[1]}"
  4. echo "第三个元素为: ${my_array[2]}"
  5. echo "第四个元素为: ${my_array[3]}"
  6. echo "数组的元素为: ${my_array[*]}"
  7. echo "数组的元素为: ${my_array[@]}"
  8. echo "获取数组的长度:"
  9. echo "数组元素个数为: ${#my_array[*]}"
  10. echo "数组元素个数为: ${#my_array[@]}" # 4
  1. $ ./test.sh
  2. 第一个元素为: A
  3. 第二个元素为: B
  4. 第三个元素为: C
  5. 第四个元素为: D
  6. 数组的元素为: A B C D
  7. 数组的元素为: A B C D
  • 多行注释

  1. 多行注释还可以使用以下格式:
  2. :<<EOF
  3. 注释内容...
  4. 注释内容...
  5. 注释内容...
  6. EOF
  7. EOF 也可以使用其他符号:
  8. :<<'
  9. 注释内容...
  10. 注释内容...
  11. 注释内容...
  12. '
  13. :<<!
  14. 注释内容...
  15. 注释内容...
  16. 注释内容...
  17. !
  • shell传递参数

脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

  1. # shell_传递参数
  2. echo "Shell 传递参数实例!";
  3. echo "执行的文件名:$0";
  4. echo "第一个参数为:$1";
  5. echo "第二个参数为:$2";
  6. echo "第三个参数为:$3";

 向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名,运行结果:

特殊字符用来处理参数:

参数处理说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
  1. echo "Shell 传递参数实例!";
  2. echo "第一个参数为:$1";
  3. echo "参数个数为:$#";
  4. echo "传递的参数作为一个字符串显示:$*";
  5. echo "圈号:$@"
  6. echo "当前进程id号:$$";
  7. echo "后台运行的最后一个进程id号:$!";
  8. echo "Shell使用的当前选项:$-";
  9. echo "最后命令的退出状态:$?";

运行结果:

$* 与 $@ 区别:

  • 相同点:都是引用所有参数。
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
  1. echo "-- \$* 演示 ---"
  2. for i in "$*"; do
  3. echo $i
  4. done
  5. echo "-- \$@ 演示 ---"
  6. for i in "$@"; do
  7. echo $i
  8. done

运行结果为

  1. $ chmod +x test.sh
  2. $ ./test.sh 1 2 3
  3. -- $* 演示 ---
  4. 1 2 3
  5. -- $@ 演示 ---
  6. 1
  7. 2
  8. 3
  • Shell 基本运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作

例如,两个数相加(注意使用的是反引号 ` 而不是单引号 ')

表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2

  1. #!/bin/bash
  2. val=`expr 2 + 2`
  3. echo "两数之和为 : $val" #4

算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
+加法`expr $a + $b` 结果为 30。
-减法`expr $a - $b` 结果为 -10。
*乘法`expr $a \* $b` 结果为  200。
/除法`expr $b / $a` 结果为 2。
%取余`expr $b % $a` 结果为 0。
=赋值a=$b 将把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]

  1. a=10
  2. b=20
  3. val=`expr $a + $b`
  4. echo "a + b : $val"
  5. val=`expr $a - $b`
  6. echo "a - b : $val"
  7. val=`expr $a \* $b`
  8. echo "a * b : $val"
  9. val=`expr $b / $a`
  10. echo "b / a : $val"
  11. val=`expr $b % $a`
  12. echo "b % a : $val"
  13. if [ $a == $b ]
  14. then
  15. echo "a 等于 b"
  16. fi
  17. if [ $a != $b ]
  18. then
  19. echo "a 不等于 b"
  20. fi
  1. a + b : 30
  2. a - b : -10
  3. a * b : 200
  4. b / a : 2
  5. b % a : 0
  6. a 不等于 b
  • 乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
  • 在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "\" 。
  • 字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":

运算符说明举例
=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
!=检测两个字符串是否相等,不相等返回 true。[ $a != $b ] 返回 true。
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
-n检测字符串长度是否不为 0,不为 0 返回 true。[ -n "$a" ] 返回 true。
$检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。
  1. a="abc"
  2. b="efg"
  3. if [ $a = $b ]
  4. then
  5. echo "$a = $b : a 等于 b"
  6. else
  7. echo "$a = $b: a 不等于 b"
  8. fi
  9. if [ $a != $b ]
  10. then
  11. echo "$a != $b : a 不等于 b"
  12. else
  13. echo "$a != $b: a 等于 b"
  14. fi
  15. if [ -z $a ]
  16. then
  17. echo "-z $a : 字符串长度为 0"
  18. else
  19. echo "-z $a : 字符串长度不为 0"
  20. fi
  21. if [ -n "$a" ]
  22. then
  23. echo "-n $a : 字符串长度不为 0"
  24. else
  25. echo "-n $a : 字符串长度为 0"
  26. fi
  27. if [ $a ]
  28. then
  29. echo "$a : 字符串不为空"
  30. else
  31. echo "$a : 字符串为空"
  32. fi
  1. abc = efg: a 不等于 b
  2. abc != efg : a 不等于 b
  3. -z abc : 字符串长度不为 0
  4. -n abc : 字符串长度不为 0
  5. abc : 字符串不为空
  • Shell echo命令

  1. echo "It is a test"
  2. # 这里的双引号完全可以省略,以下命令与上面实例效果一致:
  3. echo It is a test
  4. # 显示转义字符
  5. echo "\"It is a test\"" # "It is a test" ,引号也可以省略

显示变量,read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量(类似于input)

  1. #!/bin/sh
  2. read name
  3. echo "$name It is a test"

结果为

  1. [root@www ~]# sh test.sh
  2. helloitsme #标准输入
  3. helloitsme It is a test #输出

显示换行 

  1. echo -e "OK! \n" # -e 开启转义
  2. echo "It is a test"
  1. OK!
  2. It is a test

显示不换行

  1. #!/bin/sh
  2. echo -e "OK! \c" # -e 开启转义 \c 不换行
  3. echo "It is a test"

输出结果:OK! It is a test

显示结果定向至文件,会新生成一个文件

echo "It is a test" > myfile

原样输出字符串,不进行转义或取变量(用单引号)

echo '$name\"'

输出结果:

$name\"
  • for循环

  1. for loop in 1 2 3 4 5
  2. do
  3. echo "The value is: $loop"
  4. done
  1. The value is: 1
  2. The value is: 2
  3. The value is: 3
  4. The value is: 4
  5. The value is: 5

while循环

  1. while condition
  2. do
  3. command
  4. done
  1. #!/bin/bash
  2. int=1
  3. while(( $int<=5 ))
  4. do
  5. echo $int
  6. let "int++"
  7. done
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5

case循环

  1. casein
  2. 模式1)
  3. command1
  4. command2
  5. ...
  6. commandN
  7. ;;
  8. 模式2)
  9. command1
  10. command2
  11. ...
  12. commandN
  13. ;;
  14. esac
  15. echo '输入 1 到 4 之间的数字:'
  16. echo '你输入的数字为:'
  17. read aNum
  18. case $aNum in
  19. 1) echo '你选择了 1'
  20. ;;
  21. 2) echo '你选择了 2'
  22. ;;
  23. 3) echo '你选择了 3'
  24. ;;
  25. 4) echo '你选择了 4'
  26. ;;
  27. *) echo '你没有输入 1 到 4 之间的数字'
  28. ;;
  29. esac
  1. 输入 1 到 4 之间的数字:
  2. 你输入的数字为:
  3. 3
  4. 你选择了 3
  1. 1、将文件夹内的所有文件的绝对路径(按行)写入 txt 文件:
  2. ls -R /home/datalab/work/datasets/test_7pilang/*.jpg > file.txt
  3. 2、当前文件夹的所有文件的文件名(按行)写入 txt 文件:
  4. ls -R  *.jpg > file.txt
  • shell中的冒号作用

  1. {str:=expr}
  2. 如果变量str不为空,${str:=expr}就等于str的值,若str为空,就把expr的值赋值给str。
  1. 在和>(重定向符号)结合使用时, 把一个文件截断到0长度, 不修改它的权限. 如果文件不存在, 则创建它
  2. : > data.xxx # 文件"data.xxx" 被清空
  3. # 与 cat /dev/null > data.xxx 作用相同, 但是不会产生一个新的进程, 因为:是一个内建命令.
  1. 冒号在Linux中是一个空命令,可以认为与shell的内建命令true相同,它的返回值是0.
  2. while循环中 while : 与 while true 的作用是等效的
  3. if/then 中可作为占位符
  4. if conditions
  5. then#什么都不做
  6. else
  7. take action
  8. fi
  9. 使用冒号还可以用作注释行的开始,但是如果有语法错误,仍将报错,这一点与使用#号不同

 shell中冒号在环境变量里的作用

我的shell文件如下

  1. #!/usr/bin/env bash
  2. export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/code
  3. echo $PYTHONPATH
  4. python code/main.py

针对这一句“export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/code

反引号作用:

冒号作用:


参考:

以上内容多半来自菜鸟教程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/154692
推荐阅读
相关标签
  

闽ICP备14008679号