Shell学习笔记

都是一些零碎的知识,遇到什么写什么吧!

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添加的环境变量是临时有效,要想永久有效就得添加到文件中:

 

 

(1)在/etc/profile文件中添加变量,对所有用户永久有效。例如:
#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查询)文件中添加环境变量,对该用户永久有效。用法跟上面相同。
 
关于source,用法为:source  FileName,作用是在当前bash环境下读取并执行FileName中的命令,该FileName可以没有执行权限。注意该命令中的脚本是在当前bash环境下执行,没有产生子shell,所以脚本添加的变量也能被当前shell所共享,跟直接执行脚本产生子shell不太一样。如同样的脚本Test.sh:
#!/bin/bash
     export mytest="Hi"
 用source Test.sh方式执行,mytest环境变量就可以添加到当前shell环境中,./Test.sh方式直接执行则不能。
另外,source命令常用“.”来代替。source Test.sh与 .  Test.sh等效。






 

posted @ 2014-09-30 23:55  Gright  阅读(254)  评论(0编辑  收藏  举报