一、引号
- 双引号:"",会把引号的内容当成整体,允许通过$符号引用其他变量值
- 单引号:’’,会把银行的内容看作整体,禁止引用其他变量的值,shell中特殊符号都会被视为普通字符
- 反撇号:``,和$()一样,引号或括号里的命令会优先执行,反撇号中不能出现嵌套。
echo "hello $name"
echo 'hello $name'
echo $(ls)
echo `ls`
二、小括号与中括号的区别
$(命令)
${变量名}
三、执行方法
- 获得执行权限,./hello.sh运行
- 使用命令解释器运行,
bash hello.sh
sh hello.sh
bash -x hello.sh 查看执行过程 调试用 - 使用source命令读取脚本文件,执行文件里的代码
source hello.shzys@:~/workspace/project/shell$ cat lesson1.sh #!/bin/bash fun1() { echo "aaa" } zys@:~/workspace/project/shell$ source lesson1.sh zys@:~/workspace/project/shell$ fun1 aaa
四、变量
命名要求
- 变量名区分大小写
- 变量名不能以数字开头
- 变量名不能含有符号
- 变量名两边不能有空格
定义方式
- 直接给变量赋值
A=123456
,echo {A:2:3}
,从A中第二个字符开始截取三个字符 - 命令的执行结果赋值给变量,
B=date +%F
- 从终端读取,
read C
,echo $C
,等待从终端输入数据,然后赋值给C - 从文件获取,
read ip mask < ip.txt
,echo $ip
,echo $mask
,ip.txt中是192.168.1.1 25.25.25.0
,中间以空格隔开
变量的分类
-
本地变量
当前用户自定义的变量,当前进程中有效,其他进程及当前进程的子进程无效。 -
环境变量
当前进程有效,并且能被子进程调用
env
:查看当前用户的环境变量
set
:设置当前用户的所有变量,临时变量与环境变量
export
:变量名=变量值 或者 变量名```bash #临时将一个本地变量变成环境变量 export A=hello #查询 env | grep ^A #永久生效环境变量 vim /etc/profile 或者 ~/.bashrc export A=hello 或者 A=hello export A 例如:系统中有一个变量PATH export PATH=/usr/local/mysql/bin:$PATH ```
-
全局变量
全局所有用户和程序都可以调用,且继承,新建的用户也默认可以调用。
$HOME/.bashrc
当前用户的bash信息,用户登录时读取
$HOME/.bash_profile
当前用户的环境变量,用户登录时读取
$HOME/.bash_logout
当前用户退出当前shell时最后读取
/etc/bashrc
全局的bash信息,所有用户都生效
/etc/profile
全局的环境变量信息
$HOME/.bash_history
用户的历史命令
说明; 以上文件修改后,都需要重新source
让其生效或者退出重新登录 -
系统变量
#!/bin/bash
echo `date`
A=world
echo $A
echo ${A}
unset A
echo $A
echo "shell name:"$0
array=(aa "aa" 11 22 33 66)
echo ${array[0]}
echo ${array[1]}
echo ${#array[*]}
echo ${!array[@]}
echo ${array[@]:1:2}
#!/bin/bash
A=123456
B=${A:2:2}
echo $B
C=`date`
echo $C
read -p "Input you name:" name
echo $name
#!/bin/bash
root=`pwd`
echo $root
#使用read命令读取文件内行内容 自动以空格隔断
read_a()
{
pwd
read ip mask < config.txt
echo $ip
echo $mask
}
#for循环取出文件每一行 但是行内不能有空格
read_for()
{
for line in $(cat tab.txt)
do
flag=${line:0:1}
if [ $flag != '#' ];then
echo $line
fi
done
}
#获取tab1.txt 取出路径和状态
read_while()
{
while read -r line
do
#echo while:$line
handle_line $line
done < tab1.txt
}
handle_line()
{
local dir=$1
local sta=$2
echo dir:$dir
echo sta:$sta
echo "--------"
}
#read_a
#read_for
read_while
获取函数返回值
function test()
{
echo abc
}
ret=`test`
echo 1=$ret
ret=$(test)
echo 2=$ret
#!/bin/bash
fun1()
{
echo "111"
return 0
}
fun2()
{
echo "222"
return 1
}
test()
{
echo "tt=$i"
}
main()
{
local res=0
#i是局部 test函数还可以访问
local i=0
for (( i=0;i<3;i++ ));do
fun2
res=$?
if [ $res == 0 ];then
echo "res=$res"
break
fi
done
echo "i=$i"
test
}
main