1.执行方式
bash ./test.sh 不需要给此脚本赋予可执行权限就可以进行执行,需要有可执行权限,chomd u+x 文件名
./test.sh 需要给此脚本赋予可执行权限
两者执行会产生一个新的进程,不会对父进程产生影响
source 和 .filename.sh 不会产生新的进程,直接在此进程进行执行。对当前shell脚本产生影响
2.管道
1. 管道符'|': 将第一个的输出结果作为第二个应用程序的输入 三个的话以此类推
如:cat test.txt | more 即分页展示text.txt的内容
3.重定向
输入重定向:是指不使用系统提供的标准输入端口,而进行重新的指定。换言之,输入重定向就是不使用标准输入端口输入文件,而是使用指定的文件作为标准输入设备。(重定向简单理解就是使用 “<”符来修改标准输入设备)
输出重定向:(通俗的讲,重定向输出就是把要输出的文件信息写入到一个文件中去,而不是将要输出的文件信息输出到控制台(显示屏))
">"将123输入到文件file中,将原来file的中内容先清空,在输入123
“>>”将123输入到文件file中,但是不清空原数据,在后追加123
“2>”如果echo 123 命令产生错误,则将错误的内容输出放在file中
“&>”错误和正确内容都输出到file中
将a.txt中的东西放到var2中,然后用echo 查看此变量
将变量var2输出到文件b
如nocmd不是一个命令,可以使用2>将错误信息输出则使用 nocmd 2> 1.text
4.变量
a=123 之间不要用空格,否则会认为是命令
注意:尽量不要使用shell进行计算,因为其性能会很慢
1.还可以将命令的结果赋值给变量 (如一个命令过于复杂,且多次使用,可以将结果放到一个变量中去) 如:lect=$(ls -l) 还可以写成 两个单引号如图
2. 因为变量中不能有空格,则遇到的字符串需要空格则需要用双引号括住,比如a=“hello bash” 如果本身有双引号了 需要再次括住 则用单引号,反之亦然。
5.变量作用域
两个shell脚本
下面展示一些 代码a.sh
。
name=huazi
ehco ${name}
./b.sh
下面展示一些 代码b.sh
。
ehco "name in b.sh"${name}
直接输出则结果是
huazi
name in b.sh
b是a的子进程,子进程不能访问到父进程进程的数据,可以在 a.sh中变量name前加上export,则子进程可以访问到
下面展示一些 a.sh
。
export name=huazi
ehco ${name}
./b.sh
再次执行a.sh
huazi
name in b.sh:huazi
脚本a中export的变量在启动其他脚本的时候会复制一份传入其他脚本,传入的值是调用其他脚本的时的值。并不是export时的值。 在脚本A中定义了一个变量V赋值为1,export了变量V,然后修改V为2,在脚本A中启动脚本B,在脚本B中变量V的值就是2。
父进程想访问子进程的东西
下面展示一些 a.sh
。
name=huazi
echo ${name}
source ./b.sh
echo 'a in' ${name}
echo 'b in name1'${name1}
下面展示一些 b.sh
。
echo "name in b.sh:"$name
name1=miaozi
echo "b in"$name1
结果
huazi
name in b.sh:huazi
b inmiaozi
a in huazi
b in name1miaozi
使用source 使用source 执行代码即是在本进程执行,而./a.sh是另开辟一个子进程执行。共享一个进程则可以共享一个变量