Shell 变量相关操作
一、变量的操作
1.创建和设置变量
两个内置命令declare和typeset创建变量。declare的-r选项可以创建只读变量,不能被撤销。
直接赋值给一个变量名也可以创建一个变量。
chen@chen-IdeaPad-Y430:~$ city=hangzhou
chen@chen-IdeaPad-Y430:~$ echo $city
hangzhou
当变量中包含空格时,则整个字符串都要用双引号括起来。
chen@chen-IdeaPad-Y430:~$ usage="usage: [-d : According to /home file] "
chen@chen-IdeaPad-Y430:~$ echo $usage
usage: [-d : According to /home file]
2.区分变量名
使用大括号来区别变量与其他字符
chen@chen-IdeaPad-Y430:~$ order=10
chen@chen-IdeaPad-Y430:~$ echo "This is ${order}th"
This is 10th
3.删除变量
使用shell内部的unset命令删除未被设置成只读属性的变量
二、变量的赋值
有直接赋值、通过read命令赋值、使用命令行参数赋值和利用命令的输出结果赋值等方法。
1.直接给变量赋值
定义变量的同时可以直接赋值,变量名前不应加符号$,且等号前后不可有空格。
2.使用read命令赋值
命令read是内置命令,可以从标准输入设备或从一个文件读数据。
Shell脚本在执行到read命令时,将暂停脚本的执行并等待键盘的输入。
该命令在给变量赋值时按如下规则
- 多个数据或变量之间用空格分隔
- 若变量个数与数据个数相等,则对应赋值
- 若变量个数大于输入数据个数,则没有输入数据的变量取空值
- 若变量个数小于输入数据个数,则多余的数据赋值给最后一个变量
chen@chen-IdeaPad-Y430:~/test$ cat logintest
#!/bin/bash
#filename:logintest
echo "Please enter your user and password: "
read user password
echo "your user: $user "
echo "your password: $password "
echo "login in success! "
执行示例结果
chen@chen-IdeaPad-Y430:~/test$ chmod u+x logintest
chen@chen-IdeaPad-Y430:~/test$ ./logintest
Please enter your user and password:
Tom 123456 7
your user: Tom
your password: 123456 7
login in success!
如果没有指定一个变量来保存read的输入内容,bash会把用户的输入放在一个名为REPLY的变量中。
chen@chen-IdeaPad-Y430:~/test$ cat read2
#!/bin/bash
#filename:read2
read -p "请输入用户名: " #-p用于显示提示信息,且用户的输入与提示信息出现在一行
echo "您输入的是: $REPLY "
chen@chen-IdeaPad-Y430:~/test$ chmod u+x read2
chen@chen-IdeaPad-Y430:~/test$ ./read2
请输入用户名: Tom
您输入的是: Tom
3.命令行参数赋值
通过使用命令行参数对位置变量赋值。当命令行上的参数多余9个时,可以使用shift命令移动位置参数。
chen@chen-IdeaPad-Y430:~/test$ cat cmdarg
#!/bin/bash
#filename:cmdarg
echo "----start----"
while [ $# -gt 0 ]
do
echo "position: $* "
shift
done
echo "---end---"
执行示例结果
chen@chen-IdeaPad-Y430:~/test$ chmod u+x cmdarg
chen@chen-IdeaPad-Y430:~/test$ ./cmdarg 1 2 3 4 5 6 7 8 9 0 11
----start----
position: 1 2 3 4 5 6 7 8 9 0 11
position: 2 3 4 5 6 7 8 9 0 11
position: 3 4 5 6 7 8 9 0 11
position: 4 5 6 7 8 9 0 11
position: 5 6 7 8 9 0 11
position: 6 7 8 9 0 11
position: 7 8 9 0 11
position: 8 9 0 11
position: 9 0 11
position: 0 11
position: 11
---end---
4.命令的输出结果赋值
使用反引号(“ ` ”)将一个可执行命令的执行结果赋值给一个变量。
root@chen-IdeaPad-Y430:/home/chen/test# cat cmdreasult
#!/bin/bash
#filename:cmdresult
CURRDIR=`pwd`
RESULT=`find /etc -name fuse.conf`
echo "----------------------------"
echo "Current Directory: $CURRDIR "
echo "Search Result: $RESULT "
echo "----------------------------"
执行示例结果
root@chen-IdeaPad-Y430:/home/chen/test# chmod u+x cmdreasult
root@chen-IdeaPad-Y430:/home/chen/test# ./cmdreasult
----------------------------
Current Directory: /home/chen/test
Search Result: /etc/fuse.conf
----------------------------
5.文件读入数据实现赋值
从文件execfile中读取文件名,通过chmod命令为每一个文件赋予可执行权限
root@chen-IdeaPad-Y430:/home/chen/test# cat readfile
#!/bin/bash
#filename:readfile
ls *.c >execfile
while read LINE
do
chmod u+x $LINE
done<execfile
三、变量的输出
echo命令和printf命令
1.printf命令:格式化输出变量
printf 的格式说明符
\" 输出双引号
\oNNN 按八进制输出
\\ 输出反斜杠
\a 响铃
\b 退格
\c 不再做后面的输出
\f 填表
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\xNNN 按十六进制输出
%% 输出%
2.echo命令:直接输出变量