linux脚本定义变量 - CSDN
精华内容
参与话题
  • 一、变量定义 变量即在程序运行过程中它的值是允许改变的量 变量是用一串固定的字符来表示不固定的值的一种方法 变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储 Script 运行时可更改的程序...

    一、变量的定义

    变量即在程序运行过程中它的值是允许改变的量
    变量是用一串固定的字符来表示不固定的值的一种方法
    变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储 Script 运行时可更改的程序信息
    在 shell 中变量是不能永久保存在系统中的,必须在文件中声明
    

    二、变量名称的规范

    eg:your_name="runoob.com"
    
    注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
    同时,变量名的命名须遵循如下规则:
    命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
    中间不能有空格,可以使用下划线(_)。
    		变量名称格式定义:
    			WESTOS_LINUX
    			Westos_Linux
    			westoS_Linux
    不能使用标点符号。
    不能使用bash里的关键字(可用help命令查看保留关键字)。
    

    在这里插入图片描述

    三、使用变量

    使用一个已经定义的变量,只要在变量名前面加美元符号
    如:
    	name='haiyan' #注意等号两边不要留空格
    	echo $name 
    	echo ${name} #推荐使用, 
    	ehco $name+$name
    变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
    for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
    done
    如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
    推荐给所有变量加上花括号,这是个好的编程习惯。
    已定义的变量,可以被重新定义
    

    四、在shell脚本中的变量种类

    在 shell 中变量分为环境级变量、用户级变量、系统级变量这三种

    环境级变量只在当前 shell 中生效, shell 关闭变量丢失
    用户级变量写在用户的骨文件(.bash_profile)中,只针对当前用户生效,切换用户后就不再生效
    系统级变量被写在系统的配置文件 /etc/profile 或者 /etc/profile.d/ 中,对于所有用户都生效
    (在https://mp.csdn.net/mdeditor/99946984#这个博客有详解)
    

    五、字符的转译及变量的声明

    \ 转译单个字符
    “” 弱引用,批量转译“”中出现的字符
    强引用,批量转译‘’中出现的字符
    ‘’与“” 两者的区别在于,“”不能转译“",“`”,“!”,“$"
    ${} 变量声明
    eg:
    A=1
    echo $Ab
    echo ${A}b
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    六、变量值的传递

    $1 脚本后的第一串字符串
    $2 脚本后的第二串字符串
    $3 脚本后的第三串字符串
    $# 脚本后所跟的字符串的个数
    $* 脚本后跟的所有字符串,模式为“1 2 3 ”
    $@ 模式后跟的所有字符串,模式为“1”“2”“3”

    vim test.sh编辑测试文件
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述## 七、补充内容
    我们也可以通过这种模式来对自己要进行的变量进行简单的运算。
    后续会有详细介绍
    在这里插入图片描述
    shell的命令行也属于一个变量,也可以进行修改在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 很多小伙伴在写shell脚本的时候需要把命令输出的值赋给一些变量,使得脚本在运行过程中能够顺利使用这些变量。例如:很多时候我们就需要获取当前目录的绝对路径,pwd这个命令大家在熟悉不过,可是要把这个命令的输出...

    很多小伙伴在写shell脚本的时候需要把命令输出的值赋给一些变量,使得脚本在运行过程中能够顺利使用这些变量。例如:很多时候我们就需要获取当前目录的绝对路径,pwd这个命令大家在熟悉不过,可是要把这个命令的输出值赋给变量就不知道何从下手了。莫慌,办法还是有的,我们可以把这个命令的输出值赋给一个叫pwd的变量(当然,你也可以随意命名一个变量名称)。具体操作是这样的:pwd=`pwd`,需要注意的是这里的引号并非通常我们使用的单引号,而是左上角ESC下面那个按键,也就是数字键1前面的那个。

    大家可以来看一下这个例子,如果想使用下面的脚本直接运行的话请删除前面的行号数字。

     1 #!/bin/bash

     2 whoami=`whoami`

     3 pwd=`pwd`

     4 today=`date`

     5 last=`last -10`

     6 echo  "Your name is $whoami"

     7 echo  "The current directory is $pwd"

     8 echo  "Today is $today"

     9 echo  "`last -10`"

     10 echo  "The last login $last"

    在第9行代码中,我们直接输出最近10次登陆的详情,这属于是直接使用,在第10行代码中我们使用了变量,实际运行结果与第9行一致。

    当然,另外一种方式就是把上面的`换成成对的小括号,半角状态下输入,需要在小括号前加“$”。

    输出结果如下:

    命令参数也是完全可以带上的,我们来看一下:

     1 #!/bin/bash

     2 LANGUAGE=$(echo -e "$LANG \n")

     3 echo $LANGUAGE

     4 list=`ls -al`

     5 echo -e "$list"

    运行结果如下,完全能够达到预期效果。

    其他方式希望小伙伴们在评论区展开讨论,大家一起进步!感觉动手去试试吧!

    展开全文
  • 相对于Perl、Python等脚本语言优势在于它能处理底层业务,因为有大量Linux命令作为支撑,“自动安装”等用shell脚本写就会非常简单。Linux下的shell脚本默认为bash ,sh其实是bash的一个链接。(1)查看默认she...
    shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,
    主要是方便管理员进行设置或者管理用的。相对于Perl、Python等脚本语言优势在于它能处理底层业务,
    因为有大量Linux命令作为支撑,“自动安装”等用shell脚本写就会非常简单。


    Linux下的shell脚本默认为bash ,sh其实是bash的一个链接。



    (1)查看默认shell的两种方法:
    1)echo $SHELL
    /bin/bash

    2)grep root /etc/passwd
    root:x:0:0:root:/root:/bin/bash


    (2)样例脚本:
    基于这个脚本来学习一下简单的shell脚本。
    #!bin/bash
    #变量定义
    ETC_DIR=/etc/sysconfig/network-scripts
    NET_DIR=/etc/sysconfig
    ROOT_UID=0 

    #if条件判断
    if [ "$UID" -ne "$ROOT_UID" ]  #判断是否为root权限
    then
       echo "Must be root to run this script"
       exit 1
    fi

    cd $ETC_DIR || {
        echo "Cannot change to necessary directory,">&2
        exit 1
    }
    #清除原来的网卡配置文件

    cat /dev/null  >ifcfg-eth0 && echo "clean ifcfg-eth0 ok!"


    #写入eth0配置:init_ip是先编辑好的网卡配置文件
    cat /root/init_ip >ifcfg-eth0 && echo "write eth0 sucessfully"
    cd $NET_DIR || {
        echo "Cannot change to necessary directory,">&2
        exit 1
    }
    service network restart   #重启网络命令
    exit 0  #返回成功


    (2)UID说明
    UID是一个系统变量,当前是root权限 UID=0,当前非root权限UID不等于0
    所以我们在这设置了一个变量ROOT_UID=0,来判断当前是否为root状态,因为我们对系统的配置文件进行修改必须使用root权限。所以执行的时候必须加sudo。

    脚本执行时候会先调用环境变量,去找相关变量,有的变量是系统已经定义可直接使用,如上文用到的UID。
    1)cat /etc/profile (全局)
    2)cat /etc/profile.d   (全局)可以把变量放在这里面就可以直接用
    3).bashrc:用户环境变量
    4).bash_profile:用户环境变量

    (3)清空文件的三种方法:
    清空日志的三种方法:
    1、echo "">test.log
    2、echo  >test.log

    3、cat /dev/null >test.log

    /dev/null称之为黑洞
    在代码中用的是第三种方法:cat /dev/null >network

    (4)&&与||的使用:
    cat /dev/null  >ifcfg-eth0 && echo "clean ifcfg-eth0 ok!"

    1.&&表示只有当前面的命令执行成功以后才执行后面的命令。 
    2.||表示前面执行不成功就执行后面命令。

    在这两个符号后面,用大括号,可以写入多条命令
    cd $NET_DIR || {
        echo "Cannot change to necessary directory,">&2
        exit 1
    }

    如果不能够进入到该目录下,就打印错误信息。
    1)&0表示标准输入。
    2)&1表示标准输出。
    3)&2表示标准出错,


    (5)脚本执行的三种方法:
    1)bash或sh + 脚本名 (文件无可执行权限,或者没指定解释器)
    2)绝对路径/脚本名 (需要可执行权限)或者./(和第一种方法类似,不过需要可执行权限)
    3)source +脚本名 或者. 脚本名

    bash或sh 指定的bash执行脚本,然后启动子shell去执行,比如,没有在脚本第一行指定使用哪一种脚本命令,就要在执行时指定解释器。
    一般脚本都会在第一行写上‘#!/bin/bash’,且只能放在第一行,放在其他行就作注释处理,则需要用使用第一种方法。但是在Linux系统默认是bash,所以无需指定也可以,但是在其他系统就不行了。

    (6)source xxx.sh 
    source和.命令是Shell的内建命令,这种方式也不会创建子Shell,直接在当前的shell中执行,并且调用系统默认的shell去执行脚本,不管脚本中是不是指定shell命令解析器。
    source和.命令不启动子shell,所以会直接执行子shell里的语句,并把变量传给父shell。脚本里面所有新建、改变变量的语句都会保存在当前shell里面。





    展开全文
  • 函数可以确保命令循环执行,可以解决命令多重复的情况,函数用来简化脚本,使脚本可以循环执行 1.函数的语法 (1)方法1 函数名(){ 函数体 return n } (2)方法2(这样比较规范) function 函数名(){ ...
     函数可以确保命令循环执行,可以解决命令多重复的情况,函数用来简化脚本,使脚本可以循环执行
    

    1.函数的语法

    (1)方法1

    函数名(){
    	函数体
    	return n
    	}
    

    (2)方法2(这样比较规范)

    function 函数名(){
    	函数体
    	return n
    	}
    
    练习:实现函数
    [root@base1 mnt]# vim function_01.sh 
     #!/bin/bash 
     function fun() { 
         echo " I love English" 
     }
    fun
    

    在这里插入图片描述

    [root@base1 mnt]# sh function_01.sh 
     I love English
    

    2.调用函数

    [root@base1 mnt]# vim function_02.sh 
     #!/bin/bash 
     function fun1() { 
         echo "I like animals"     # 定义和函数内部
     } 
     count=1 
     while [ $count -le 3 ] 
     do 
         fun1                      # 调用函数
         count=$[ $count + 1 ] 
     done
     echo "end of loop"            # 结束循环
     echo "end of script"          # 结束脚本
    

    在这里插入图片描述

    [root@base1 mnt]# sh function_02.sh
    

    在这里插入图片描述

    3.引用函数

    每次引用函数时,bash会重新回到函数的定义 
    
    注:函数不一定要在最开始定义,但是如果函数在定义前使用,会报错
    

    #举例:

    [root@base1 mnt]# vim  function_03.sh 
     #!/bin/bash 
     count=1        # 定义计数器
     echo "Before function definition" 
     function fun1() { 
         echo "fun1"         # 定义fun1
     } 
     while [ $count -le 5 ] 
     do 
         fun1 
         count=$[ $count + 1 ] 
     done 	  
     echo "End of loop"
      	 fun2      # 调用fun2,但是fun2还没有定义
     function fun2() {     # 定义fun2
       echo "fun2"   
     }
    

    在这里插入图片描述

    [root@base1 mnt]# sh function_03.sh
    

    在这里插入图片描述

    函数名必须是唯一的,如果重新定义了函数。新的函数会覆盖旧的
    

    举例:

    [root@base1 mnt]# vim  function_04.sh  
     #!/bin/bash 
     function fun1() { 
         echo "fist fun1"  
     } 
     fun1 
     function fun1() { 
         echo "second fun1" 
     } 
     fun1 
     function fun1() {
         echo "third fun1" 
     } 
     fun1 
     echo "End..."
    

    在这里插入图片描述

    [root@base1 mnt]# sh  function_04.sh
    

    在这里插入图片描述

    4.返回值

    (1)默认退出状态码

    默认情况下,函数的退出状态码就是函数最后一条命令的返回的退出状态码,用 $? 查看
    

    #举例:

    [root@base1 mnt]# vim function_exit_01.sh 
     #!/bin/bash 
     function fun1() { 
         echo "trying to display a non-existent file" 
         ls -l file &> /dev/null 
     } 
     echo "test the function: " 
     fun1 
     echo "The exit status is: $?" 
    

    在这里插入图片描述

    [root@base1 mnt]# sh function_exit_01.sh 
    

    在这里插入图片描述

    (2)使用return命令(返回函数特定状态码)

    Shell使用return命令来退出函数,并返回特定的退出状态码,返回值在0~255之间
    

    [root@base1 mnt]# vim function_exit_02.sh 
    10 #!/bin/bash 
    11 function db1() { 
    12     read -p "Enter a value:" value 
    13     echo "doubling the value..." 
    14     return $[ $value * 2 ] 
    15 } 
    16 db1 
    17  
    18 echo " The new  value is $?"
    

    在这里插入图片描述

    [root@base1 mnt]# sh function_exit_02.sh
    

    在这里插入图片描述

    (3)使用函数输出将函数的输出保存在shell变量中,可以获得任何类型的函数输出,并将其保存到变量中

     [root@base1 mnt]# vim function_exit_03.sh 
      #!/bin/bash 
      function db1() { 
          read -p "Enter a value:" value 
          echo $[ $value * 2 ] 
      } 
      result=`db1` 
      echo "The new value is $result"
    

    在这里插入图片描述

    [root@base1 mnt]# sh function_exit_03.sh
    

    在这里插入图片描述

    (4)函数中使用变量

    可以向函数中传递参数,函数名会在$0变量中定义,函数命令行上的任何参数都会通过$1,$2定义
    
    $# 来判断传给函数的参数数目
    
    练习1:定义算法,当脚本后什么都不输入时,输出-1,当脚本后输入一个数字时,把这个数字扩大2倍,当输入两个数字时,把这两个数字相加
    [root@base1 mnt]# vim function_value_01.sh 
     #!/bin/bash 
     a=$1    # 第一串字符定义为变量a
     b=$2    # 第二串字符定义为变量b
     c=$#    # 用变量c来记录输入字符的个数
     function addem() { 
         if [ "$c" == 0 ];then 
             echo "-1"           # 当没有输入数字的时候输出-1
         elif [ "$c" == 1 ];then 
             echo  $[ a + a ]    # 当输入一个数字的时候,把这个数字扩大为二倍
         elif [ "$c" == 2 ];then 
             echo  $[ a + b ]    # 当输入两个数字的时候,把这两个数字相加
         else 
           echo "error" 
         fi 
     } 
     addem   # 调用函数
    

    在这里插入图片描述

    [root@base1 mnt]# sh function_value_01.sh         # 不输入数字
    -1
    [root@base1 mnt]# sh function_value_01.sh 1       # 输入一个数字
    2
    [root@base1 mnt]# sh function_value_01.sh  1  2   # 输入两个数字
    3
    
    练习2:定义算法,当用户的输入不符合输入要求时,告诉用户具体用法,当输入正确时,计算乘积
    [root@base1 mnt]# vim function_value_02.sh 
     #!/bin/bash 
     function fun1() { 
         echo $[ $1 * $2 ] 
     } 
      
     if [ $# -eq 2 ];then 
         value=`fun1 $1 $2` 
         echo "The result is $value" 
     else 
         echo "Usage:fun1 a b" 
     fi
    

    在这里插入图片描述

    [root@base1 mnt]# sh  function_value_02.sh 10
    Usage:fun1 a b
    [root@base1 mnt]# sh  function_value_02.sh 10 10
    The result is 100
    

    (5)函数不能从命令行获取脚本的参数值

    [root@base1 mnt]# vim overall_value.sh 
     #!/bin/bash 
     function fun1(){ 
         db1=$[ $value * 2 ] 
     } 
     read -p "Enter a value:" value 
     fun1 
     echo "The new value is:" $value
    

    在这里插入图片描述

    [root@base1 mnt]# sh overall_value.sh
    

    在这里插入图片描述

    2.变量的作用域

    (1)全局变量

      任何地方都生效的变量,默认情况下,脚本主体内定义全局变量,函数内可以用,函数外也可以
    

    [root@base1 mnt]# vim overall_value_02.sh 
     #!/bin/bash 
     function fun1(){ 
         temp=$[ $value + 5 ] 
         result=$[ $temp *2 ] 
     } 
     temp=4   # 这两个变量是全局变量,既可以引用到上面的函数中,也可以引用到下面的条件中 
     value=6 
      
     fun1 
     echo "The result is $result" 
     if [ $temp -gt $value ];then 
         echo "temp is lager" 
     else 
         echo "temp is smaller" 
     fi
    

    在这里插入图片描述

    [root@base1 mnt]# sh overall_value_02.sh 
    The result is 22
    temp is lager 
    

    (2)局部变量

      不能被引用到函数外
      
      定义方法:local value
    

    [root@base1 mnt]# vim overall_value_02.sh 
     #!/bin/bash 
     function fun1(){ 
         local temp=$[ $value + 5 ]  # 定义temp为局部变量 
         result=$[ $temp *2 ] 
     } 
     temp=4   # 这两个变量是全局变量,既可以引用到上面的函数中,也可以引用到下面的条件中 
     value=6 
      
     fun1 
     echo "The result is $result" 
     if [ $temp -gt $value ];then  # 此处的temP变量是temp=4这个全局变量,并不是fun1中的局部变量 
         echo "temp is lager" 
     else 
         echo "temp is smaller"	
    

    在这里插入图片描述

    [root@base1 mnt]# sh overall_value_02.sh   # 和上面全局变量比较,发现了什么不同呢
    The result is 22
    temp is smaller
    
    练习1:用函数实现计算阶乘
    [root@base1 mnt]# vim jc.sh 
     #!/bin/bash 
     function jc(){ 
         if [ $1 -eq 1 ];then # 当输入的数字是1时,输出1 
             echo 1 
         else 
             local temp=$[ $1 - 1 ]   # 定义局部变量temp 
             local result=`jc $temp`  # 定义局部变量result 
             echo $[ result * $1 ] 
         fi 
     } 
     read -p "Enter a value: " value 
     result=`jc $value`  # 计算结果 
     echo "The jc of $value is: $result"  
    

    在这里插入图片描述

    [root@base1 mnt]# sh jc.sh 
    Enter a value: 5
    The jc of 5 is: 120
    [root@base1 mnt]# sh jc.sh 
    Enter a value: 3
    The jc of 3 is: 6 
    
    展开全文
  • shell脚本变量

    千次阅读 2019-11-28 11:39:51
    变量定义 变量即在程序运行过程中它的值是允许改变的量 变量是用一串固定的字符来表示不固定的值的一种方法 变量是一种方便的占位符,用于引用计算机内存地址,该地址可以存储Script运行时可更改的程序信息 在...
  • declare 或 typeset定义变量功能介绍:声明变量的属性,如果使用declare,后面没有任何参数,那么bash就会主动将所有变量名与内容都调出来,just as set.语 法:declare [-aixr] variable参数说明:-a :将后面的...
  • Linux系统为例,linux系统里面有很多个命令,脚本可以是一个或者多个命令的集合,通过运行脚本,达到既定的功能或者效果。shell与批处理的比较:Linux环境下有个脚本语言叫做shell,一般的,shell脚本文件以.sh...
  • 顾名思义,用户自定义,也就是用户自己定义变量,在一定的范围内,你可以随意定义,而那个范围就是用户变量定义格式。 变量格式: 变量名,由字母或下划线打头,不允许数字开头,后面由字母、数字或下划线组成,...
  • linux中使用脚本定义环境变量1、新建脚本文件 $touch test.sh 2、使用vi/vim等编辑器编写脚本 $vim test.sh 修改内容如下:#!/bin/sh #My first script export ARCH=arm export PATH=~/gcc-arm-none-eabi/gcc-...
  • Shell脚本定义变量和重新赋值

    千次阅读 2019-09-10 11:14:34
    定义变量 定义变量时,变量名不加美元符号($),如: 复制代码代码如下: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下...
  • Shell脚本定义变量和环境变量的引用

    万次阅读 2016-05-07 14:24:28
    一、定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则: •首个...
  • Linux shell解释型脚本语言直接调用linux命令Shell 脚本执行的两种方式 sh 脚本文件 ./脚本文件 ,需要脚本文件有执行权限 [root@localhost test]# ./test.sh -bash: ./test.sh: Permission denied 赋执行权限: ...
  • shell脚本定义--创建--变量

    千次阅读 2018-04-25 15:27:25
    什么是shell脚本?提前写好可执行语句,能够完成特定任务的文件顺序,批量化处理解释型程序常见的脚本Bash ShellPython/Perl/RubyJSP/PHP/ASP/CGIJavaScript创建shell脚本的三个步骤1.新建文本文件2.添加可以执行的...
  • shell 脚本定义变量,command not found

    万次阅读 2018-07-04 20:10:12
    shell脚本是我们在工作中经常会写的一个东西一个新手小白或者是不懂linux的初学者可能觉得很难(我也是渣渣),编写的过程中总是遇到各种个样的错误这里举例一个我遇到的问题,在shell中定义变量#!/bin/bashstr = “I...
  • 原先的做法是,所有的启动命令都使用linux的crontab,但是因为任务过多,所以crontab里的内容越来越多,不好管理,改时间也不方便,所以这里写脚本进行管理。       同时为了方便查看...
  • SHELL脚本中的变量的介绍

    千次阅读 2019-06-11 14:33:00
    1 变量定义及种类 1.1 变量定义变量即在程序运行过程中它的值是允许被改变的量; 变量是用一串固定的字符来标示不固定值的一种方法; 变量是一种使用方便的占位符,用于引用计算机的内存地址,该地址可以...
  • 1. 变量名通常最好是大写格式。规范要求,方便识别阅读。 2. 变量可以在自身的shell和子shell中使用 3. 环境变量定义后最好使用export 或source ...6. 需要注意,在定义到定时任务crond 时,脚本中用到的环境变量...
  • shell: 测试环境在linux上搭建 可以使用shell脚本进行自动化部署测试环境 1. shell介绍: 是一段应用程序,... 弱类型语言,定义变量时,不需要指定变量的类型 2. shell规范: shell脚本文件是以.sh进行结尾 ...
  • linux中shell脚本设置环境变量

    千次阅读 2016-12-28 16:13:11
    linux中shell脚本设置环境变量 ——怎样用脚本来设置环境变量 我想编一个脚本程序,用来对一组环境变量进行设置或取消 但由于脚本程序对变量的设置在退出脚本后就消失了,有没有间接办法能够实现这个功能? ...
  • a=100 c=a b=${a} 上面代码中, 第一行代码,将变量a赋值100; 第二行代码,将变量c赋值为字符a; 第三行代码,将变量b赋值为a的值100 。
1 2 3 4 5 ... 20
收藏数 127,267
精华内容 50,906
热门标签
关键字:

linux脚本定义变量