shell脚本执行方式:
Linux中shell脚本的执行通常有4种方式,分别为工作目录执行,绝对路径执行,sh执行,shell环境执行。
首先,看下我们的脚本内容
[tan@tan scripts]$ ll
total 4 -rw-rw-r--. 1 tan tan 68 May 8 23:18 test.sh [tan@tan scripts]$ cat test.sh #!/usr/bin/bash /usr/bin/python <<-EOF print "Hello Shell" EOF 1、工作目录执行
工作目录执行,指的是执行脚本时,先进入到脚本所在的目录(此时,称为工作目录),然后使用 ./脚本方式执行
[tan@tan scripts]$ ./test.sh
-bash: ./test.sh: Permission denied [tan@tan scripts]$ chmod 764 test.sh [tan@tan scripts]$ ./test.sh Hello Shell 如图,报了权限错误,这里需要赋权,使用chmod 764 test.sh 赋权后就可以正常执行了
./的意思是说在当前的工作目录下执行hello.sh。如果不加上./,bash可能会响应找到不到hello.sh的错误信息。因为目前的工作目录 (/data/shell)可能不在执行程序默认的搜索路径之列,也就是说,不在环境变量PASH的内容之中。查看PATH的内容可用 echo $PASH 命令。现在的/data/shell就不在环境变量PASH中的,所以必须加上./才可执行。
2、绝对路径执行
绝对路径中执行,指的是直接从根目录/到脚本目录的绝对路径
[tan@tan scripts]$ pwd
/home/tan/scripts [tan@tan scripts]$ `pwd`/test.sh Hello Shell [tan@tan scripts]$ /home/tan/scripts/test.sh Hello Shell 这里 `pwd` 指的是该命令执行结果,等同于 /home/tan/scripts
3、sh执行
sh执行,指的是用脚本对应的sh或bash来接着脚本执行
[tan@tan scripts]$ sh test.sh
Hello Shell [tan@tan scripts]$ bash test.sh Hello Shell 注意,若是以方法三的方式来执行,那么,可以不必事先设定shell的执行权限,甚至都不用写shell文件中的第一行(指定bash路径)。因为方法三 是将hello.sh作为参数传给sh(bash)命令来执行的。这时不是hello.sh自己来执行,而是被人家调用执行,所以不要执行权限。那么不用 指定bash路径自然也好理解了啊,呵呵……。
4、shell环境执行
shell环境执行,指的是在当前的shell环境中执行,可以使用 . 接脚本 或 source 接脚本
[tan@tan scripts]$ . test.sh
Hello Shell [tan@tan scripts]$ source test.sh Hello Shell 注释:“./”、sh、bash是相同的执行方式,“.”和source是相同的
source和“.”执行脚本时,将脚本中语句在本shell中执行,
sh、bash和./是在执行脚本时先启动一个新的shell,然后让脚本中的语句在新的shell中执行,执行完后就退出。
二:重定向与管道操作
1、重定向
程序 = 指令(命令) + 数据(变量)
在程序中,数据如何输入和输出
1) 数据输入:键盘 -- 标准输入,但是不是唯一输入方式
echo "123456" | passwd --stdin "username" //输入密码
./useradd.sh< user.txt //把user.txt中文件重定向到useradd.sh中
2) 数据输出:显示器--标准输出,但是不是惟一的输出方式。
ls /etc/ > a.txt
fd文件标识符0-9:相当于给文件分类
0:标准输出
1:标准输入
2:错误输入输出
常见重定向符号:
1)标准输出
> 覆盖重定向
set -C 关闭覆盖重定向的功能 set +C:恢复
>| 强制重定向
>> 追加重定向
2)标准输入
< a<b :把b交给a执行
<< 追加输入
3)错误输出
2> 2>>
扩展:不需要输出内容,只需要输出状态;
echo $? :判断上一条命令是否正确(0正确,1-255其他都不正确)
2、管道符 ( | )
| 前一个命令的执行结果交给后一个命令来执行
二、Shell变量
使用shell变量
shell变量不区分类型,如果要指定变量类型也可用declare定义。
环境变量
1)所有环境变量都是系统全局变量,可以用于所有子进程中。
2)环境变量用export导出,但如果不写入指定配置文件(~/.bash_profile,~/.bash,/etc/bashrc,/etc/profile),退出命令行会丢失。
3)环境变量应使用大写。
显示环境变量:
set:输出所有变量,包括全局变量、局部变量。
env:显示环境变量。
declare:所有变量,函数,整数等。
set -o:所有参数配置信息。
unset消除本地变量和环境变量:
unset JAVA_
1.通过系统用户登录时的流程:
![]() 2.非登录Shell
只会加载~/.bashrc或者/etc/bashrc
普通变量
定义本地变量
1 var_name1=12345 #为连续内容无需解析其他变量时可不用引号
2 var_name2='Do you have time.' #用单引号,原样输出 3 var_name3="No, I'm working." #会对其中变量进行解析,其他同单引号 4 var_name4=`ls -alh` #获取命令结果 5 var_name5=$(ls -l) #同上 特殊位置参数变量
常用特殊位置参数说明:
进程中的特殊状态变量:
![]() 进程中的特殊状态变量:
![]() 用法:
1)判断命令、脚本和函数是否执行成功
2)执行" exit 数字 " ,会返回数字给$?
3)在函数中" return 数字 ",效果同上
bash shell系统内置变量命令:
1)echo:在屏幕上输出变量 命令格式 echo args 其中arges可以是变量和字符串组合
2)eval:
命令格式:eval args
功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令。
3)exec:
命令格式: exec 命令参数
功能:在不创建新的子进程前提下,转去执行指定的命令,指定命令执行完毕后,终结该进程。
4)read:
命令格式: read [参数] [变量名](该变量不能为特殊变量)
功能:从标准输入读取字符串等信息,传给shell内部定义的变量。
1 read -t 10 -p 'Pls input the num: ' num
5)shilft:
命令格式:shilft—Shilft positional parameters
功能:在程序中每使用一次shilft语句,都会使所有位置参数向左移动一个位置。
6)exit:
退出shell,可选定一个数字作为返回值。
五)变量子串
![]() ![]() 六)特殊扩展变量
![]() 三、变量的数值计算
一)算术运算符
**:幂运算 其他略
二)算术运算命令
![]() ![]() 变量名称的规范
变量名不能用数字开头
变量名中不能有小数点
变量名不能用纯数字
变量名可以是字母开头再加数字
变量名中不能有斜杠“/”、“$”、“#”、“@”等特殊符号
|
|