shell_3

保存永久环境变量

1.root用户:

  在/etc/profile文件中添加变量【对所有用户生效(永久的)】

  并执行以下代码

  # source /etc/profile

2.普通用户:

  在用户目录下的.bash_profile或者.bashrc文件中增加变量【对单一用户生效(永久的)】
    export PS1="\[\e[1;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$"

  并执行以下代码

  # source .bash_profile

3.短暂的环境变量:

  直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】

  在shell的命令行下直接使用[export变量名=变量值]定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。

  例如:export PATH=/usr/local/webserver/php/bin:$PATH

常量

1.声明只读常量,只能声明不能修改删除
readonly name
或
declare -r name
2.exit 退出当前进程,只读环境变量消失
3.查看只读变量
declare -r
或
readonly -p
>>> UID=1000”常量不可修改

使用场景:
pi=3.14
需要设置成固定值的常量






{}

不开启shell,影响当前的环境
{ name=mage;echo $name; }
注意结尾也有;把命令当作一个整体去执行

位置变量

1.表示执行脚本时后面跟的第几个参数 
	$1 $2 $3 ...${10}
2. 表示当前执行脚本的名称
	basename $0 :去掉脚本路径,只是保留脚本的名称
3. 表示参数的个数
	$#
4. 显示输入的所有的变量
	1. $*  传递给脚本的所有参数,全部参数合为一个字符串
  2. $@ 传递给脚本的所有参数,每个参数为独立的字符串
  区别 :
   ex:
    f1.sh
    >echo "f1.sh arg is $*"
    >f2.sh "$*"
    f2.sh
    >echo "f2.sh arg is $1"
    
    运行:./f1.sh a b c
    	>#f1.sh arg is a b c
      >#f2.sh arg is a b c
    将$*换成$@时
    	>#f2.sh arg is a
    
5.set -- 清空所有的位置参数

    
ln -s 源文件 连接文件
arg.sh
	>echo "script name is $0"


>ln -s arg.sh link.sh
>./link.sh

>#script name is link.sh

$0显示的是当前执行脚本的名称
不能将软连接再创建软连接


ls |wc -l
查看当前的文件夹的个数
pidof
查找指定进程的进程号
pidoff bash
shift
f1.sh
>echo "$1"
>echo "$2"
>echo "$3"
>shift 1
>echo "$1"
>echo "$2"
>echo "$3"

>#f1.sh 1 2 3

>echo "1"
>echo "2"
>echo "3"
>echo "2"
>echo "3"
将参数移除一个
shift + num
移除多个参数
$?
保存最近一次的命令的执行状态(显示上一次执行命令的状态)
0:成功    1-255:失败


f1.sh                 f2.sh
>ls										>hostnam
>hostnam							>ls

>#f1.sh				
>#echo $?
	127      执行脚本时最后一条指令未执行成功就不会显示0
  				或
    			 中间有语法错误

>#f2.sh
>#echo $?
	0				最后一条指令执行成功,中间可能有未执行的指令,但中间没有语法错误	
 
f3.sh
>ls
>exit 10 :指定运行脚本结束时的状态   例:退出时的数据是10

>#f3.sh
>#echo $?
>>>10
z
pstree -p
查看进程树
f1.sh
#! /bin/bash 

echo "name=$name"
显示进程树

	----bash----f1.sh

  
  f1.sh为bash的子进程,局部变量间的父子变量不可相互影响 不可相互传递
  
  
  >name=haha
  >./f1.sh
  ># name=
  
  
  >export name 
  >./f1.sh
  ># name=haha
  
bash中的算术运算
>x=1
>y=2

>let z=x+y
>echo z
>>>3

1.let var=x+y
2.$[数字运算]  : 中括号支持数据运算
3.$((数字运算))
4.echo '算术表达式'|bc
5.var=$(expr $1 + $2 + ..)  
		注意:
  		中间有空格
    	乘法要转译\*
6.declare -i x=10
>declare -i x=10
>declare -i y=20
>declare -i z=x+y
直接声明数值
bash随机数生成器
RANDOM (0-32767)

[RANDOM%6]   :  得到的是[0-5]的整数

[RANDOM%6+31] : 得到的是[0-37]的整数

> echo $[RANDOM%6]
>3    : 产生一个0-5的随机数

随机打印字体颜色
31-37
$COLOR=$[RANDOM%7+31];echo -e "\033[1;${COLOR}mcolor\033]0m]"

或

$COLOR=$[RANDOM%7+31];echo -e "\e[1;${COLOR}m color\e]0m]"

-q

grep -q 
unzip -q 

>echo $?

>0

-q不显示执行的结果
短路与&& 短路或||
cmd1 && cmd2 
如果cmd1为假则cmd2不执行   
如果cmd1为真则cmd2执行

a b 通过异或交换值
脱字符

>a=12
>b=14
> a=$[a^b];b=$[a^b];a=$[a^b];echo $a $b
>14  12

第一个(异或)a保留的相当于中间值 


习题

编写脚本,统计/etc/passwd第10个用户和第20个用户的id的和
UID=`head -10 /etc/passwd|tail -1|cut -d: -f3`

比较
1.字符串比较
[ str   空格 = 空格 str ]
2.数字比较
[ num1 -eq num2 ]

如果磁盘空间大于80% 给出提示信息
df -h |grep "^/d[a-z]"|awk -F " " '{ print $5}'|sort -nr|head -n1|cut -d% -f1

1.取到数字 
2.取到数字过大的那一行
3.取到文件夹的路径名称

你可能感兴趣的:(shell脚本)