都是一些零碎的知识,遇到什么写什么吧!
1、shell脚本参数
C用(int *argc, char *argv[])处理参数,python sys.argv[0](脚本名字)、sys.argv[1]、sys.argv[2]等表示各个参数,shell脚本自己处理命令参数的方式如下:
(1) $# 传递到脚本的参数个数,不包括脚本命令本身。如判断参数是否是2个:
#!/bin/bash
if [ $# != 2 ]; then
echo "Error! should need 2 parameters!"
exit 1
fi
(2) $0 脚本名字;$1,$2,......依次表示第一个参数,第二个参数,。。。。。。
(3) $* 以一个单字符串显示所有向脚本传递的参数,此选参数可超过9个。如:
若脚本参数为./test.sh arg1 arg2,
则执行echo $*,
结果为:"arg1 arg2"
(4) $$ 脚本运行的当前进程ID号。
(5) $! 后台运行的最后一个进程的进程ID号。
(6) $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。如:
若脚本参数为./test.sh arg1 arg2,
则执行echo $*,
结果为:"arg1""arg2" 与#*的差别,每个参数都是一个单独的字符串。
(7) $- 显示shell使用的当前选项,与set命令功能相同。(搞不懂)
(8) $? 显示最后命令的退出状态。 0表示没有错误,其他任何值表明有错误。如:
ls ./
echo $?
$?为0表示ls命令执行成功。
2、管道与重定向
管道操作符”|“,输出左边命令传出的正确输出信息,对与stderr信息没有直接处理能力。然后,传递给右边的命令,作为stdin。
要求:
(1) 管道命令只处理前一个命令正确输出,不处理错误输出;
(2) 管道命令右边命令,必须能够接收标准输入流命令才行。如cat test.txt | ls ,ls不支持stdin,左边的数据将被丢弃。
$ cat display.sh | ls
call.py libtest3.so libtest.so send_mail_text.py test3.cpp test4.cpp
display.sh libtest4.so printfile.sh test2.cpp test3.so test.c
重定向:
左边命令应该有标准输出 > 或者>> 右边只能是文件
左边命令应该有标准输入 < 或者<< 右边只能是文件
管道是触发了两个子进程执行"|"两边的程序,而重定向是在一个进程内执行。
3、shell与export
首先要知道用户登录linux系统之后,系统会启动一个用户shell。在该shell下执行shell脚本,会创建一个子shell,子shell可以共享父shell的环境变量,父shell却不能共享定义在子shell中的环境变量。子shell中定义的环境变量只在该子shell中有效。
在shell中执行程序时,shell会提供一组环境变量,export可新增、修改和删除环境变量,供后续执行的程序使用。export设置的变量效用只在该次登录中有效。
语法:export [-fnp] [变量名称]=[变量设置值]
参数:
-f 代表[变量名称中为]函数名称。
-n 删除指定变量,实际上并未删除,只是不会输出到后续指令的执行环境中。
-p 列出所有shell赋予程序的环境变量,默认参数。
如:
Test@ubuntu:~/code$ export //等同 export -p
declare -x HOME="/home/Test"
declare -x LANG="zh_CN.UTF-8"
declare -x LANGUAGE="zh_CN:en_AU:en_CA:en_GB:en_NZ:en_US:en"
declare -x LC_ADDRESS="zh_CN.UTF-8"
/*中间省略*/
declare -x TERM="linux"
declare -x USER="Test"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SESSION_ID="1"
</pre><pre name="code" class="plain">Test@ubuntu:~/code$ export mytest="Hi"
<pre name="code" class="plain">Test@ubuntu:~/code$ export
declare -x HOME="/home/Test"
declare -x LANG="zh_CN.UTF-8"
declare -x LANGUAGE="zh_CN:en_AU:en_CA:en_GB:en_NZ:en_US:en"
declare -x LC_ADDRESS="zh_CN.UTF-8"
/*中间省略*/
declare -x TERM="linux"
declare -x USER="Test"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SESSION_ID="1"
declare -x mytest="Hi"
Test@ubuntu:~/code$ export -n mytest
Test@ubuntu:~/code$ export
declare -x HOME="/home/Test"
declare -x LANG="zh_CN.UTF-8"
declare -x LANGUAGE="zh_CN:en_AU:en_CA:en_GB:en_NZ:en_US:en"
declare -x LC_ADDRESS="zh_CN.UTF-8"
/*中间省略*/
declare -x TERM="linux"
declare -x USER="Test"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SESSION_ID="1"
因为export添加的环境变量是临时有效,要想永久有效就得添加到文件中:
#vi /etc/profile
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
export PATH="$PATH:/home/Test" //在原PATH变量上添加数据
<span style="font-family: Arial, Helvetica, sans-serif;">注:修改文件后要想马上生效还要运行source /etc/profile,不然只能在下次重进此用户时生效。</span>
(2)在用户目录下的.bash_profile(该文件在不同的linux系统下,文件名不同,有的是.profile,基本以profile结尾,可以用man bash查询)文件中添加环境变量,对该用户永久有效。用法跟上面相同。
#!/bin/bash
export mytest="Hi"
用source Test.sh方式执行,mytest环境变量就可以添加到当前shell环境中,./Test.sh方式直接执行则不能。
: