1.变量的定义
变量即在程序运行过程中它的值是允许改变的量
变量是用一串固定的字符来标示不固定的值的一种方法
变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储 Script 运行时可更改的程序信息
在 shell 中变量是不能永久保存在系统中的,必须在文件中声明
2.shell脚本中变量的种类
在 shell 中变量分为环境级变量,用户级变量,系统级变量
环境级变量只在当前shell中生效, shell关闭变量丢失
用户级变量写在用户的骨文件中,只针对当前用户生效
系统级变量被写在系统的配置文件/etc/profile或者/etc/profile.d/中,对于所有用户都生效shell脚本中变量的定义方法
3.shell脚本中变量的定义
a=10 //仅在当前环境(不可继承)
环境级
export a=99 //当前环境和当前环境下面(可以继承)
用户级
vim ~/.bash_profile
export a=17
系统级
vim /etc/profile //系统中所有用户都生效
export a=37
注:证明su与su - 的区别
su - | //切换用户并切换用户环境 |
---|---|
su | //切换用户,不切换用户环境 |
前面我们执行脚本时给脚本可执行权限,然后使用其绝对路径便可执行脚本,能否直接使用脚本名执行?在~/.bash_profile中指定环境变量,便可直接执行:
cd
vim .bash_profile
export PATH=$PATH:/mnt //指定脚本执行的路径,/mnt中的脚本可以直接执行;可用echo $PATH查看可以使用
source .bash_profile //使.bash_profiled中的设置生效,即刷新
注:若果export PATH=$PATH:/mnt写错了,会导致许多命令不可用,但可以使用命令的绝对路径使用命令
还原方法:修改配置文件,使文件正确,然后刷新source .bash_profile,此时命令依旧不可用,需要从新打开shell
注:echo $PS1–直接修改的设置没有在配置文件中生效,关闭重新打开就有正常了
4.变量名称的规范
变量名称中通常包含大小写字字母,数字,下划线(不是必须)
变量名称格式:
WESTOS_LINUX
Westos_Linux
westoS_Linux
5.字符的转译及变量的声明
\ | 转译一个字符或字符串 |
---|---|
“” | 弱引用,批量转译 “” 中出现的字符, |
‘’ | 强引用,批量转译 ‘’ 中出现的字符 |
‘’ 与 “” 两者的区别 | , “” 不能转译 “”,"`","!","$" |
${} | 变量声明 |
例1:
a=1
echo $ab //输出变量ab的值(把ab当一个变量)
echo ${a}b //输出变量a的值与字符b
例2:数组
a=(1 2 3 4 5)
echo $a //1
echo ${a[0]} //1
echo ${a[1]} //2
echo ${a[*]} //1 2 3 4 5
5.变量值传递
$0 | 脚本名 |
---|---|
$1 | 脚本后的第1串字符串 |
$2 | 脚本后的第2串字符串 |
$3 | 脚本后的第3串字符串 |
$# | 脚本后所跟字符串的个数 |
$* | 脚本后跟的所有字符串,模式为“ 1 2 3 ” |
&@ | 脚本后跟的所有字符串,模式为“ 1”“2”“3 |
$$ | 脚本执行的id号 |
测试:编写脚本
#!/bin/bash
echo \$0 is $0
echo \$1 is $1
echo \$2 is $2
echo \$3 is $3
echo \$# is $#
echo \$* is $*
echo \$@ is $@
echo \$$ is $$
watch -n 1 date //不结束,打入后台用来查看脚本进程id号
注:$$
echo $$ 当前shell的id
6.用read实现变量传递
read -p "input: " WESTOS //实现交互
read -s WESTOS //隐藏输入
7.linux系统中命令别名的设定
当前环境:
alias xie='vim' //仅在当前shell中可用,重新打开失效
xie file
当前用户:
vim .bashrc //仅当前用户可用
alias xie='vim'
source .bashrc
所有用户:
vim /etc/bashrc //系统可用
alias xie='vim'
清除:
alias //查看当前所在用户可以使用的别名
删除配置文件中的信息 + unalias xie(删除当前环境别名,删除配置文件,但环境中的还在)
8.利用脚本执行结果设定脚本
time=`date` | 适用于所有shell |
---|---|
time=$(date) | 有局限性 |
测试:
vim test.sh
#!/usr/bin/perl
print `date` //perl test.sh 可以运行
print $(date) //perl test.sh不可以运行
$?:
是命令在执行完成之后产生的退出值
范围是 [0-255]
当 $0=0 时标示命令执行没有错误输出
这个值可以用 exit 命令执行 .
例如 exit 66
9.脚本中的函数
- 相当于递归,一直调用自己,知道满足退出条件后退出
之前我们使用read只能实现一次交互,完成之后就退出了;为了实现不退出,多次执行,可以使用函数来解决。
例1:
#!/bin/bash
ACTION()
{
read -p "please input a word: " WORD
[ "$WORD" = "exit" -o "$WORD" = "EXIT" ]&&{
echo bye
exit 0
}||{
echo $WORD
}
ACTION //调用自己
}
ACTION //第一次执行