shell变量

基本

shellday220190801092330

  • 变量划分
    • 按作用域划分
      • 全局变量
        • 对所有用户都生效
      • 局部变量
        • 对特定用户生效
    • 按生命周期划分
      • 永久变量
        • 写入配置文件的永久生效
      • 临时变量
        • 由用户创建的内部变量,登出后失效
  • 变量初始化顺序
    1. /etc/profile全局生效

    2. ~/.bashrc~/.bash_profile内部调用(其实是先读.bash_profile~/.bashrc会先进行alias别名赋值,然后调用/etc/bashrc)

    3. ~/.bash_profile

  • 变量约束
    • 书写规范
      • =等号两边不能有空格
      • 对于字符串类型的值尽量用双引号包起
      • 开头第一行必须明确指定使用的shell解析器
    • 命名规范
      • 与C家族语言命名规范差不多
      • 可以使用下划线数字与字母的拼写
      • 不要以数字开头命名变量
      • 变量需要具有一定的含义,可以是单词或缩写
      • 不能使用中文字符命名
    • 其他约束
      • 尽量标注作者、时间戳、版本号、邮箱信息
      • 书写注释,增加代码可读性
      • 如果有可能尽量使用英文书写(包括代码和注释)
      • 如果在windows下写的脚本,请注意格式转换(dos2unix)

环境变量

查看系统的环境变量可以使用setenv命令,前者输出系统环境变量的完整定义方法,而后者直接输出变量名和值

用户定义环境变量可以使用export,如下:

MY_NAME="zhuyongci"
export MY_NAME

特殊变量

$0shell内置的特殊变量,该变量通常存储脚本名称,也可显示脚本的执行路径等信息。

$1-n是脚本的参数,其序号对应命令参数(args)的第1、2、3、n的参数,取值是以命令行参数间的空格划分的。

$#是脚本的命令行参数的总个数

$*是命令行所有参数,但其不区分这些参数,而是将这些参数视为一个整体,字符串

$@也是命令行的所有参数,区分参数,参数与参数以空格划分为一个,每个参数独立

$?存储上一条命令的返回值,通常情况下,返回0值即为命令成功执行,非零值意味着命令执行出错或不正确

$$存储脚本的PID

$!上一个后台运行脚本的PID

$_获取脚本的最后一个参数

参数传递方式

  1. 直接传递参数,命令行参数列表

    test.sh $1 $2 $3 $n
    
  2. 间接传递参数,重新赋值

    #!/bin/bash
    var1=$1
    var2=$2
    
    echo "$var1 $var2"
    
  3. 交互,获取标准输入

    #!/bin/bash
    #获取标准输入
    read -p "请输入您的名字: " your_name
    read -p "请输入您的年龄: " your_age
    echo -e "您的名字是:$your_name\n您的你年龄是:$your_age\n"
    

格式化字符串

  1. 统计用户输入字符串的长度

    #!/bin/bash
    #统计输入的字符串长度
    read -p "请输入您的家庭住址: " address
    #方法1
    len=$(echo "$address" | wc -L)
    echo -e "\033[32m方法1>\033[0m您的住址:$address\n您输入了${len}个字符。"
    #方法2
    len=$(echo ${#address})
    echo -e "\033[32m方法2>\033[0m您的住址:$address\n您输入了${len}个字符。"
    #方法3
    len=`expr length "$address"`
    echo -e "\033[32m方法3>\033[0m您的住址:$address\n您输入了${len}个字符。"
    #方法4
    len=$(echo $address | awk '{print length}')
    echo -e "\033[32m方法4>\033[0m您的住址:$address\n您输入了${len}个字符。"
    

    **注: ** echo使用单引号和双引号时显示不一样,单引号时不解析字符串中的变量值,也就是显示原始的字符串,使用双引号时会对字符串中的变量进行替换,替换为该变量的值,需要注意的是,如果在字符串中间加入某个变量时,尽量将变量名用{}包起,否则会出现无法解析变量的现象。

  2. 切片

    #使用以下写法可对变量进行切片
    my="I'm zhuyongci"
    #从字符串开头取2个字符,然后打印出来
    echo "${my:0:2}"
    #从字符串的第3位取1个字符,然后打印
    echo "${my:2:1}"
    

    执行结果:

    shell变量切片20190801112747

  3. 以空格位分割,取字符串中小于3位的单词

    方法1:使用for遍历字符串

    #!/bin/bash
    #统计位数小于3的单词
    read -p "Enter your english name: " your_name
    for i in $your_name; do
    	[ ${#i} -lt 3 ] && echo $i
    done
    

    执行结果:

    forshell20190801125245

    方法2:使用awk

    echo "I am zhuyongci" | xargs -n1 | awk '{if(length<3)print}'
    

    方法3:依然使用awk,在awk内部使用for

    echo "I am zhuyongci" | awk '{for(i=1;i<=NF;i++)if(length($i)<3)print $i}'
    
  4. 变量的删除(截取)

    从前往后删除(截取)变量的内容

    #变量定义
    blog_url="www.zhuyongci.com"
    #取一级域名,删除.之前的*字符
    echo "${blog_url#*.}"
    #取顶级域名,##表示*.可出现多次
    echo "${blog_url##*.}"
    

    执行结果:

    cutvar120190801125621

    从后向前截取

    #去掉顶级域名,%表示从后开始,然后取任意*字符,取到第一个.的位置
    echo "${blog_url%.*}"
    #去掉一级域名,只保留二级域名,%%表示取多次
    echo "${blog_url%%.*}"
    

    执行结果:

    cutvar220190801125621

  5. 变量的替换

    只替换第一次出现的匹配内容

    #变量定义
    blog_url="www.zhuyongci.com"
    #替w为s
    echo "${blog_url/w/s}"
    

    执行结果:

    replace1char20190801130006

    多次替换

    echo "${blog_url//w/s}"
    

    执行结果:

    replace_all20190801130101

    替换域名

    echo "${blog_url/www.zhuyongci/ktss}"
    

    执行结果:

    replace_domainname20190801130213

总结:

`反引号与$()的区别

`包起来执行效果与$()没有什么太大差异,但最大的差异是,`不支持嵌套,$()可以随意嵌套。

执行脚本的形式

子shell执行

shell执行会在当前shell内新开一个子shell来执行脚本,子shell仅继承部分父shell的变量(由export关键字添加的变量会继承给当前的子shell)

  1. 解析器直接执行

    #在此情况下,允许该脚本没有执行权限
    bash script.sh
    #或
    sh script.sh
    
  2. 直接执行脚本

    #直接执行脚本必须具备执行权限
    #假设执行当前目录下的test.sh
    ./test.sh
    #绝对路径
    /root/test.sh
    
当前shell执行

不使用子shell执行,直接在当前shell环境执行该脚本。

#使用source关键字执行
source ./test.sh
#或
. test.sh
. /root/test.sh

# shell  bash 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×