首页 > 系统相关 >shell的相关知识(变量、脚本定义)

shell的相关知识(变量、脚本定义)

时间:2024-08-09 23:51:09浏览次数:5  
标签:脚本 shell 变量 user1 echo etc bash 定义

一、shell的相关知识:

1、对于shell编程语言大体分为:机器语言、汇编语言、高级语言

2、shell变量类型:事先确定数据的存储格式和长度

shell变量分为:字符型、数值型

数值型又分为:整型、浮点型(在shell中一般不使用浮点型数值进行操作)

3、shell:弱类型编程语言

强:变量在使用前,必须事先声明,甚至还需要初始化:

弱:变量用时声明:也不需要区分类型:

显式:明确要转换成什么类型:

隐式:不明确转换成什么类型,系统要看你进行什么操作,它会自动给字符转换成相应类型进行操作,例:11+c=?

默认shell中的变量不能进行运算 例:# C=$A+$B

4、变量赋值:VAR_NAME=VALUE

5、如何定义变量名称:

       a、只能包含字母、数字和下划线,并且不能数字开头;

       b、不应该跟系统中已有的环境变量重名;

       c、最好做到见名知义;

6、bash变量类型:

       a 、环境变量

       b、本地变量(局部变量)

       c、位置变量

       d、特殊变量

a、环境变量:作用域为当前shell进程及其子进程;

    格式:export varname=value   "导出"

b1、本地变量:作用域为整个bash进程;(随时用随时定义)

    格式:变量名=:

b1、局部变量:作用域为当前代码段;

    格式:local 变量名=值

c、位置变量:$1(第一个参数),$2(第二个参数),...

例:./filetest.sh  /etc/fstab  /etc/inittab

    第一个参数$1:/etc/fstab

    第二个参数$2:/etc/inittab

shift:轮替,每执行一个shift就会踢出一个; 格式:shift [n] 可以一下踢出多个

例:./filetest.sh /etc/fstab /etc/inittab /etc/passwd /tmp/config.sh

使用shift 2 就表示把/etc/fstab和/etc/inittab踢出去,而后/etc/passwd就变成了第一个

d、特殊变量:

         $?:上一个命令的执行状态返回值;

         $#:传送给shell程序的位置参数的数量(参数的个数)

         $*:调用shell程序时所传送的全部参数的单字符串,"参数1""参数2"…形式保存的参数列表

         $@:"参数1""参数2"...形式保存的参数列表

 

二、什么是脚本

 

脚本简单地说就是一条条的文字命令,这些文字命令是可以看到的,通过记事本程序或其它文本编辑器创建、并被保存为特定文件扩展名(例如:对于VBScript脚本编程语言来说,脚本文件扩展名为.VBS)的普通文本文件。

#/bin/bash(对于脚本而言,第一行必须加上这句命令)

#:表示注释信息

显示脚本内容时一定要指定路径 例#./脚本名或#bash 脚本名

 

练习:写一个脚本

给脚本传递两个参数(整数)

显示此两者之和,之乘积;

#!/bin/bash

#

if [ $# -eq 2 ]; then

echo "the sum is: $[$1+$2]"

echo "the prod is: $[$1*@]"

else

echo "Usage:cacl.sh ARG1 ARG2"

fi

 

1、程序执行,可能有两类返回值;

          a、程序执行结果

          b、程序状态返回代码(0-255)

          0:正确执行

          1-255:错误执行,1,2,127(系统预留);

2、输出重定向:

>,>>,2>,2>>,&>如果命令返回的结果对我们没有什么用处,我们可以把它放在/dev/null(软件设备)

 

练习:写一个脚本,完成以下任务

1、添加5个用户,user1,....

2、每个用户的密码同用户名,而且要求,添加密码完成后不显示passwd命令的执行结果信息;

3、每个用户添加完成后,都要显示用户某某已经成功添加;

#!/bin/bash

useradd user1 | echo "user1 tianjia successfull"

echo "user1" | passwd --stdin user1 > /dev/null

useradd user2 | echo "user2 tianjia successfull"

echo "user2" | passwd --stdin user2 > /dev/null

useradd user3 | echo "user3 tianjia successfull"

echo "user3" | passwd --stdin user3 > /dev/null

useradd user4 | echo "user4 tianjia successfull"

echo "user4" | passwd --stdin user4 > /dev/null

useradd user5 | echo "user5 tianjia successfull"

echo "user5" | passwd --stdin user5 > /dev/null

或者#!/bin/bash

useradd user1

echo "user1" | passwd --stdin user1 &> /dev/null

echo "add user1 successfull."

useradd user2

echo "user2" | passwd --stdin user2 &> /dev/null

echo "add user2 successfull."

useradd user3

echo "user3" | passwd --stdin user3 &> /dev/null

echo "add user3 successfull."

useradd user4

echo "user4" | passwd --stdin user4 &> /dev/null

echo "add user4 successfull."

useradd user5

echo "user5" | passwd --stdin user5 &> /dev/null

echo "add user1 successfull."

 

3、撤销变量:(针对于任何变量)

unset VARNAME

4、脚本在执行时会启动一个子shell进程;

命令行中启动的脚本会继承当前shell环境变量;

系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量;

引用变量:${变量名},括号有时可省略。

变量实际是内存空间,命名,变量用完之后要回收

5、条件判断:

比如:如果用户不存在

         添加用户,给密码并显示添加成功;

  否则

         显示如果已经没在,没有添加;

bash中如何实现条件判断?

条件测试类型:整数测试、字符测试、文件测试

条件测试的表达式:

         [expression]

         [[expression]]

         test test< /span>命令+表达式)

整数比较:

         -eq:测试两个整数是否相等;不等,为假,相等,为真;比如 $A -eq $B

         -ne:测试两个整数是否不等;不等,为真,相等,为假;比如 $A -ne $B

         -gt:测试一个数是否大于另一个数;大于,为真,否则,为假;比如 $A -gt $B

         -lt:测试一个数是否小于另一个数;小于,为真,否则,为假;比如 $A -lt $B

         -ge:大于或等于;比如 $A -ge $B

         -le:小于或等于;比如 $A -le $B

例:定义两个变量

INT1=63

INT2=77

[ $INT1 -eq $INT2 ]

[[ $INT1 -eq $INT2 ]]

test $INT1 -eq $INT2

 

文件测试:

         -e 文件 :表示测试文件是否存在

         -f 文件:测试文件是否为普通文件

         -d 文件:测试指定路径是否为目录

         -r 文件:测试当前用户对指定文件是否有读取权限

         -w 文件:测试当前用户对指定文件是否有写权限

         -x 文件:测试当前用户对指定文件是否有执行权限

比如:

[ -e /etc/inittab ]表示测试这个文件是否存在;

[ -x /etc/rc.d/rc.sysinit ]表示这个文件对当前用户是否有执行权限;

例:

FILE=/etc/inittab

if [ ! -e $FILE ]; then

echo "no file."

exit 8

fi

 

条件判断,控制结构:

a、单分支if语句

if 判断条件; then

  statement1

  statement2

  ...

fi

 

b、双分支的if 语句:

if 判断条件;then

 statement1

statement2

...

else

statement1

statement2

fi

 

练习:写一个脚本

给定一个用户,判断其UID与GID是否一样

如果一样,就显示此用户为"good guy";否则,就显示此用户为"bad guy"。

#!/bin/bash

USERNAME=user1

USERID=`id -u $USERNAME`

GROUPID=`id -g $USERNAME`

if [ $USERID -eq $GROUPID ]; then

echo "Good guy"

else

echo "Bad guy"

fi

练习:写一个脚本

判定命令历史中历史命令的总条目是否大于1000;如果大于,则显示"Some command will gone." 否则就显示"OK".

#!/bin/bash

HISTORY1=`history | wc -l`

if [ $HISTORY1 -lt 1000 ] &> /dev/null; then

echo "Some command will gone."

else

echo "OK"

fi

 

c、多分支的if语句:

if 判断条件1; then

statement1

..

elif 判断条件2; then

statement2

...

elif 判断条件3; then

statement3

...

else

statement4

...

fi

 

练习:写一个脚本

给定一个文件:

如果是一个普通文件,就显示之;

如果是一个目录,以显示之;

否则,此为无法识别文件;

#!/bin/bash

#

FILE=/etc/rc.d/rc/sysinit

if [ ! -e $FILE ]; then

echo "NO such file."

exit 6

fi

if [ -f $FILE ]; then

echo "Common file."

elif [ -d $FILE ]; then

echo "Directory."

else

echo "Unknown."

fi

 

6、定义脚本退出状态码

exit:退出脚本

exit 数字(0表示正确,1-255表示错误)

如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码:

测试脚本是否有语法错误:

bash -n 脚本

bash -x 脚本:单步执行(可以清楚查看每步是否有语法错误)

 

练习:写一个脚本

给定一个文件,比如/etc/inittab

判断这个文件中是否有空白行;

如果有,则显示其空白行数;否则,显示没有空白行。

先判断文件是否存在,如果不存在就会显示'no /etc/inittab',否则就会进行下面的操作;

#!/bin/bash

FILE=/etc/inittab

if [ ! -e $FILE ]; then

echo "No $FILE."

exit 8

fi

 

if grep "^$" $FILE &> /dev/null; then

echo "Total blank lines: `grep "^$" $FILE | wc -l`."

else

echo "No blank line."

fi

 

练习:写一个脚本

给定一个用户,获取其密码警告期限;

而后判断用户密码使用期限是否已经小于警告期限;

提示:计算方法,最长使用期限减去已经使用的天数即为剩余使用期限;

如果小于,则显示"Warning";否则,就显示"OK".

#!/bin/bash

USERNAME=luo

long=`grep "\<$USERNAME" /etc/shadow | cut -d: -f5`

jing=`grep "\<$USERNAME" /etc/shadow | cut -d: -f6`

change=`grep "\<$USERNAME" /etc/shadow | cut -d: -f3`

a=`date +%s`

let v=$a/86400

let A=$v-$change

let B=$long-$A

if [ $B -gt $jing ]; then

echo "OK"

else

echo "Warning"

fi

 

7、在shell中如何进行算术运算:

a、let 算术运算表达式

比如: let C=$A+$B

b、$[算术运算表达式]

             C=$[$A+$B]

c、$((算术运算表达式))

             C=$(($A+$B))

d、expr 算术运算表达式,表达式中各操作及运算符之间要有空格,而且要使用命令引用

             C=`expr $A + $B`

8、命令的间逻辑关系:

    逻辑与:&&;

第一个条件为假时,第二条件不用再判断,最终结果已经有;

第一个条件为真时,第二条件必须得判断;

     逻辑或:||

例如:

a、如果用户user6不存在,就添加用户user6

! id user6 && useradd user6

或id user6 || useradd user6

b、如果用户存在,就显示用户已存在,否则,就添加此用户;

id user1 && echo "user1 exists." || useradd user1

c、如果用户不存在,就添加;否则,显示其已经存在;

! id user1 $$ useradd user1 || echo "user1 exists."

d、如果用户不存在,添加并且给密码;否则,显示其已经存在;

!id user1 && useradd user1 && echo "user1" | passwd --stdin user1 || echo "user1 exists."

标签:脚本,shell,变量,user1,echo,etc,bash,定义
From: https://www.cnblogs.com/smoke520/p/18351733

相关文章

  • shell脚本
                          添加用户和组的练习  1、创建一个用户mandriva,其ID号位2002,基本组位distro(组ID位3003),附加组位linux#groupadd-g3003distro;groupaddlinux;useradd-u2002-g3003-Glinuxmandriva 2、创建一......
  • linux自定义启动服务
    启动程序你需要分清楚,是一般的程序还是服务对于有些服务开机要启动,关机的时候还要关闭,所以,比较好的方法是写服务脚本,然后放到/etc/init.d,然后在相应的运行级启动目录中添加链接。如果只是一般的程序,并且关机时不需要退出。那么加在任何一个自启动的脚本都可以。下面结合condor启......
  • 自定义类型:结构体
    文章目录结构体结构体定义和声明结构体的初始化和赋值对结构体类型名的优化结构体的自引用与嵌套结构体访问与操作匿名结构体结构体中的内存对齐(面试常考)计算结构体字节大小对齐规则为什么存在内存对齐?修改默认对齐数结构体传参结构体实现位段位段的内存分配位段跨平......
  • C++入门基础知识(笔记):成员变量和成员函数分开存储,非静态成员变量,是属于类的对象上,空对
    在C++中,类内的成员变量和成员函数分开存储只有非静态成员变量才属于类的对象上。1.空对象占用内存空间为:1个字节,代码演示:#include<iostream>usingnamespacestd;//成员变量和成员函数分开存储classPerson{};//这是一个空对象voidtest01(){ Personp;......
  • Java基础语法:变量与数据类型
    变量1.概念:变量是用来存储数据的命名容器并在程序的不同部分使用它。2.语法:数据类型变量名称=初始值;可以这样理解:**数据类型:**鱼缸**变量名称:**鱼的名字**变量的值:**鱼缸里装的鱼或数量数量数据类型基本数据类型-整型:1.byte:8位,有符号整数(-128到127)2.short:......
  • systemctl 如何自定义添加服务
    创建一个服务文件:在/etc/systemd/system/目录下创建一个以.service结尾的文件,比如myservice.service[Unit]Description=MyServiceAfter=network.target[Service]ExecStart=/path/to/your/service/executableWorkingDirectory=/path/to/your/service/directoryUser=......
  • ./执行shell脚本提示“No such file or directory”
     ./执行shell脚本时提示如下,而关键在前半句,"/bin/sh^M:badinterpreter"错误的解释器。^M符号使得系统无法正确判断shell解释器为/bin/sh。这其实是Windows系统下编辑脚本,换行带来的'\r'。$./test.sh-bash:./test.sh:/bin/sh^M:badinterpreter:Nosuchfileordire......
  • Java基础——注解1——注解的定义与使用
    ......
  • 深入分析编程命名规范:成员变量命名约定的比较与分析
    目录标题1.引言2.成员变量命名约定简介谷歌命名规范Qt命名规范微软命名规范其他使用`_`前缀的规范小结3.各命名规范的详细分析谷歌命名规范:成员变量后缀`_`Qt和微软命名规范:成员变量前缀`m_`其他使用`_`前缀的规范比较总结4.综合比较可读性可维护性学习曲......
  • Python-和-PowerShell-协作教程-全-
    Python和PowerShell协作教程(全)原文:PowerShellandPythonTogether协议:CCBY-NC-SA4.0一、面向调查人员的PowerShell简介PowerShell提供了一个强大的获取引擎,可以从实时系统、服务器、外围设备、移动设备和数据驱动的应用程序(如ActiveDirectory)中获取大量信息。......