Shell学习笔记

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

一、shell脚本参数linux

C用(int *argc, char *argv[])处理参数,python sys.argv[0](脚本名字)、sys.argv[1]、sys.argv[2]等表示各个参数,shell脚本本身处理命令参数的方式以下:shell

(1) $# 传递到脚本的参数个数,不包括脚本命令自己。如判断参数是不是2个:ubuntu

 

   #!/bin/bash
   if [ $# != 2 ]; then                                                                                                                   
       echo "Error! should need 2 parameters!"
       exit 1
   fi

 

(2) $0 脚本名字;$1,$2,......依次表示第一个参数,第二个参数,。。。。。。
bash

(3) $* 以一个单字符串显示全部向脚本传递的参数,此选参数可超过9个。如:函数

若脚本参数为./test.sh arg1 arg2,
则执行echo  $*,
结果为:"arg1 arg2"

 

 

 

(4) $$ 脚本运行的当前进程ID号。spa

(5) $! 后台运行的最后一个进程的进程ID号。code

(6) $@  与$*相同,可是使用时加引号,并在引号中返回每一个参数。如:进程

 

若脚本参数为./test.sh arg1 arg2,
则执行echo  $*,
结果为:"arg1""arg2"  与#*的差异,每一个参数都是一个单独的字符串。

 

(7) $-  显示shell使用的当前选项,与set命令功能相同。(搞不懂)字符串

(8) $?  显示最后命令的退出状态。 0表示没有错误,其余任何值代表有错误。如:

 

ls ./
echo $?
$?为0表示ls命令执行成功。

 

 

二、管道与重定向

管道操做符”|“,输出左边命令传出的正确输出信息,对与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

重定向:

 

左边命令应该有标准输出  > 或者>>   右边只能是文件

左边命令应该有标准输入  < 或者<<   右边只能是文件

        管道是触发了两个子进程执行"|"两边的程序,而重定向是在一个进程内执行。


三、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等效。

相关文章
相关标签/搜索