变量的使用
命名规范
在定义变量时,有一些规则需要遵守。
-
变量名可以由字母、数字和下画线组成,但是不能以数字开头。如果变量名是"2name",则是错误的。
-
在 Bash 中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。比如:
[root@localhost ~]# aa=1+2
[root@localhost ~]# echo $aa
1+2
看到了吧,变量 aa 的值不是"3",而是"1+2"。在 Bash 中,变量类型是字符串型,所以认为"1+2"只是一个字符串,而不会进数值运算(数值运算方法会在后续章节中介绍)。
-
变量用等号"=“连接值,”=“左右两侧不能有空格。这是 Shell 语言特有的格式要求。在绝大多数的其他语言中,”=“左右两侧是可以加入空格的。但是在 Shell 中命令的执行格式是"命令 [选项] [参数]”,如果在"="左右两侧加入空格,那么 Linux 会误以为这是系统命令,是会报错的。
-
变量值中如果有空格,则需要使用单引号或双引号包含,如 test=“hello world!”。双引号括起来的内容"$"和反引号者都拥有特殊含义,而单引号括起来的内容都是普通字符。
-
在变量值中,可以使用转义符""。 , 单引号无法识别转义字符和变量,双引号可以识别转义字符和变量
1 #!/bin/bash
2
3 str="hello world"
4 echo "$str"
- 如果需要増加变量值,那么可以进行变量叠加。 例如:
[root@localhost ~]#test=123
[root@localhost ~]#test="$test"
456
[root@localhost ~]# echo $test
123456
#叠加变量test,变量值变成了123456
[root@localhost ~]#test=${test}789
[root@localhost ~]# echo $test
123456789
#再叠加变量test,变量值变成了123456789
变量叠加可以使用两种格式:"$变量名"或 ${变量名}。
-
如果要把命令的执行结果作为变量值赋予变量,则需要使用反引号或 KaTeX parse error: Expected 'EOF', got '#' at position 31: …ot@localhost ~]#̲ test=(date)
[root@localhost ~]# echo Stest
2013年10月21日 星期一20:27:50 CST -
环境变量名建议大写,便于区分
变量命名案例1
反引号,当脚本中需要执行一些命令并且将执行的结果赋给变量的时候需要用反引号括起来
``
例如:
1 #!/bin/bash
2
3 str=`date '+%F %T'`
4 echo $str
变量命名案例2
变量值中如果有空格,则需要使用单引号或双引号包含,如 test=“hello world!”。双引号括起来的内容"$"和反引号者都拥有特殊含义,而单引号括起来的内容都是普通字符:
hadoop@liutao-GE5S:~/shell$ cat test.sh
#!/bin/bash
ss=123
str="wewewsdas$ss eqwe" # =符号左右没有空格,有空格会被认为是一条命令
echo $str
str='sasasas$ssqqq'
echo $str
hadoop@liutao-GE5S:~/shell$ ./test.sh
wewewsdas123 eqwe
sasasas$ssqqq
只读变量
语法 : readonly 变量名
hadoop@liutao-GE5S:~/shell$ cat test.sh
#!/bin/bash
ss=123
str="wewewsdas$ss eqwe"
echo $str
str='sasasas$ssqqq'
echo $str
readonly str
str=10
echo str
hadoop@liutao-GE5S:~/shell$ ./test.sh
wewewsdas123 eqwe
sasasas$ssqqq
./test.sh: 行 11: str:只读变量
str
接受用户输入
read -p '输入: ' filepath
经过测试read的变量默认是加单引号的无法识别~符号.
hadoop@liutao-GE5S:~/shell$ cat test.sh
#!/bin/bash
read -p '输入文件路径: ' filepath
touch $filepath
ls $filepathhadoop
@liutao-GE5S:~/shell$ ./test.sh
输入文件路径: /home/hadoop/shell
1111.sh filepath path.sh test1 test.sh
使用 unset 命令可以删除变量。
语法:
unset variable_name
变量被删除后不能再次使用。unset 命令不能删除只读变量。
hadoop@liutao-GE5S:~/shell$ cat test.sh
#!/bin/bash
myUrl="https://www.runoob.com"
unset myUrl
echo $myUrl
hadoop@liutao-GE5S:~/shell$ ./test.sh
变量的三种情况
运行shell时,会同时存在三种变量:
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
我的理解是shell变量 = 局部变量 + 环境变量
变量总结
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,可以不用引号
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
单引号
str='this is a string'
单引号字符串的限制:
1. 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
2. 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号
your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
输出结果为:
Hello, I know you are "runoob"!
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
拼接字符串
your_name="runoob"
**使用双引号拼接: **
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
**使用单引号拼接: **
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
**输出结果为:**
```bash
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !
变量保存linux的命令
#!/bin/bash
a=`ll` # 命令生效需要放在``中
echo "$a"
echo打印中,带引号和不带引号的区别(带$符号)
我正在捕获ps aux的输出:
current_processes=`ps aux | grep "tempdir" | tail -3`
当我回应它时,它看起来像这样
echo $current_processes
19984 10089 17784
当我回声加双引号时,它看起来像这样:
echo "$current_processes"
19984
10089
17784
当我使用双引号但没有双引号时,为什么它会将这些放在新行上?
原因如下:
效果来自shell.如果没有双引号,shell会用空格替换换行符,制表符和空格.您可以使用双引号来避免这种替换.