首页 > 代码库 > Shell变量

Shell变量

第一个Shell脚本

创建一个文件,以.sh作为扩展名(注意Linux是没有扩展名这个概念的,可以随意取.s或者.甚至可以没有扩展名),这里取.sh是为了我们好识别这是个Shell脚本。

这里我在你自己想要存放文件的目录下创建一个Shell脚本,命名为first.sh

技术分享

在默认的vi编辑器中,第一行输入如下代码:

技术分享

第一行开头"#!"是一个约定的标记,特别重要,它告诉系统这个脚本需要什么解释器来执行,即哪一种Shell

第二句 echo命令后面加了字符串,表示在打印后面的字符串。再保存,退出。

怎么执行我们刚创建好的脚本呢?

chmod +x ./first.sh  #使脚本具有执行权限./first.sh  #执行脚本,注意不能有空格

或者直接:

 sh first.sh  #注意在当前路径执行,否则写绝对路径 

技术分享

定义变量

在Shell脚本中变量名的几个要求:

  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用 bash 里的关键字(可用 help 命令查看保留关键字)。 

特别注意变量名和等号之间不能有空格

//正确:myName="Jim"//错误:myName = "Jim"

在定义变量的时候,直接可以左边变量名,右边为值,中间用等号连接,在强调一遍(等号两边不能有空格

 定义变量举例:

stu_name="Jack"stu_Num=12

我们怎么使用变量呢?在使用的时候,我们用$变量名,就可以输出对应得值

name="Jim"echo $name

技术分享

但是我们最好在变量名前后加{},形式为:${变量名}

name="Jim"echo ${name}

这样有几个好处,一是便于我们很直观的看出这是变量,还有一种情况就是看代码:

language="Java"echo "I like $languageScript"

结果会输出: I like JavaScript 吗?会吗?系统很能智能的识别到language是变量吗?

你可以试试就知道了,不过我敢保证,下面这样肯定可以:

language="Java"echo "I like ${language}Script"

结果:

技术分享

对吧,这样系统可以很好的识别到大括号括起来的是变量。

变量重新赋值

language="Java"language="Shell"echo "I like ${language}Script"

只读变量

readonly  变量名 

这样变量就是只读,不能修改了

技术分享

删除变量

unset  变量名 

删除后,结果输出就为空:

技术分享

特殊变量

变量含义
$0当前脚本的文件名
$n传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#传递给脚本或函数的参数个数。
$*传递给脚本或函数的所有参数。
$@传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?上个命令的退出状态,或函数的返回值。
$$当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

 

 

 

 

 

 

例如:查看点Shell进程的ID

echo $$

技术分享

 

命令行参数

运行脚本时,传递给脚本的参数为命令行参数,例如有以下脚本:

#!/bin/bashecho "当前Shell进程的ID为:$$"echo "文件名称:$0"echo "文件的第一个参数:$1"echo "文件的第二个1参数:$2"echo "传递给脚本的参数个数:$#"echo "传递给脚本或函数的所有参数:$*"

运行结果:

技术分享

$* 和 $@ 的区别

#!/bin/bashecho "当前Shell进程的ID为:$$"echo "文件名称:$0"echo "文件的第一个参数:$1"echo "文件的第二个1参数:$2"echo "传递给脚本的参数个数:$#"echo "传递给脚本或函数的所有参数:$*"echo "\$*=" $*echo "\"\$*\"=" "$*"echo "\$@=" $@echo "\"\$@\"=" "$@"echo "print each param from \$*"for var in $*do    echo "$var"doneecho "print each param from \$@"for var in $@do    echo "$var"doneecho "print each param from \"\$*\""for var in "$*"do    echo "$var"doneecho "print each param from \"\$@\""for var in "$@"do    echo "$var"done

执行结果:

技术分享

 

Shell变量