Linux命令行与shell脚本编程大全(一)

目录

一、基本 bash shell命令

 二、更多shell命令

三、理解Shell

四、Linux环境变量

全局变量

局部变量

五、Linux文件权限

六、管理文件系统

七、安装软件程序

八、构建基本脚本

重定向

管道(  |  )

执行数学运算

退出脚本

九、使用结构化命令

if语句

test命令

数值比较和字符串比较

文件检查

复合条件测试

if-then 高级特性

case命令

十、更多结构化命令

for命令

while命令

until命令

其他知识:


一、基本 bash shell命令


创建文件 : touch

链接文件:符号链接:是一个实实在在的文件,两个通过符号链接在一起的文件,彼此的内容并不相同。使用ln -s命令。

硬链接:会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但他们从根本上而言是同一个文件。原始文件必须事先存在,使用ln命令。

查看文件类型 : file

查看整个文件 : cat , more , less

查看部分文件 : tail , head

 二、更多shell命令

探查进程 : ps , 常用 ps -ef , ps -l

实时监测进程 : top。第一部分显示系统的概况:第一行显示当前时间、系统运行时间、登录的用户数以及系统的平均负载(三个值代表最近1min、5min、15min)如果近15min内的平均负载都很高,说明系统可能有问题。

第二行显示了进程概要信息:有多少进程处在运行、休眠、停止或是僵化状态

下一行显示了CPU的概要信息。

紧跟其后的两行说明了系统内存的状态。第一行是系统的物理内存:总共多少内存,当前用了多少,还有多少。后一行表示同样的信息,不过针对系统交换空间。

最后一行显示当前运行中的进程纤细列表。

PID:进程ID; USER:进程属主名字; PR:进程优先级; NI:进程的谦让值; VIRT:进程占用的虚拟内存总量; RES:进程占用物理内存总量; SHR:进程和其他进程共享的内存总量; S:进程的状态(D可中断休眠,R运行,S休眠,T跟踪或停止,Z僵化); %CPU:进程使用CPU时间比例; %MEM:进程使用的内存占用内存的比例; TIME+:自进程启动到目前位置的CPU时间总量; COMMAND:进程对应的命令行名称。

结束进程 : kill , killall

挂载存储媒体: mount

移除存储媒体: umount

查看所有已挂载的磁盘 : df

显示特定目录的磁盘使用情况 : du

排序数据 : sort

搜索数据 : grep

压缩数据 : bzip2(.bz2) , compress(.Z) , gzip(.gz) , zip(.zip) 。只能压缩单个文件或者某个目录中的文件,或者是能有通用符表示的多个文件。

归档数据 : tar (将多个文件归档进单个文件)

三、理解Shell


进程列表 : 将命令列表包含在括号中 , 如 :( pwd ; ls ; cd /etc; pwd; cd ; pwd; ls)会创建一个子shell来执行命令。

后台模式 : 在命令结尾加上字符 & ,如 sleep 3000 &

协程 : 在后台生成一个子shell,并在这个shell中执行命令 ,如 : coproc my_job { slee 10; }。

外部命令 : 也称为文件命令,存在于bash shell 之外的程序,当外部命令执行时,会创建一个子进程。

内建命令 : 不需要使用子进程来执行,执行速度更快

命名别名 : alias li='ls -li',仅在它所被定义的shell进程中才有效。可以将alias设置放在$HOME/.bashrc文件中,使其效果永久化。

四、Linux环境变量


全局变量

查看全局变量: printenv 或者 env,查看某一个环境变量printenv ,如: printenv PATH,或者echo,如: echo $PATH. 设置全局变量时,可以先创建一个局部变量,然后再使用export将其导出为全局变量。如 : export my_variable. 子shell不能改变父shell中的全局变量,即使使用export命令。

局部变量

查看局部变量: set命令会显示为某个特定进程设置的所有环境变量,包括局部、全局和用户定义变量。

设置用户变量: my_variable="Hello world",该变量在子shell中无效。数组变量mytest=(one two three four five),输出所有的值echo ${mytest[*]},输出单个值 echo ${mytest[2]},可以使用unset删除数组中的某个值,但是只会使该索引上的值为空。素组变量在shell脚本编程时并不常用,它的可移植性不好。

删除环境变量 : unset my_variable。如果该变量是全局变量,且在子shell中删除了该变量,在父shell中该变量依然可用。

设置PATH变量 : PATH=$PATH:/home/christine/Scripts 。 只能持续到退出或者重启系统。

环境变量的定位 : 登录时作为默认登录shell的启动文件为/etc/profile, 作为非登录shell的交互式shell(如在命令行敲入bash时启动),它不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。 非交互式shell使用的BASH_ENV环境变量,它可以继承父shell导出过的变量,使用当前shell的局部变量和全局变量。

环境变量持久化 : 在/etc/profile.d 目录中创建一个以.sh结尾的文件。把所有新的或者修改过的全局变量设置放在这个文件夹中。

五、Linux文件权限

/etc/passwd文件 :

登录用户名: 用户密码: 用户账户UID(数字形式):用户帐号组ID(GID数字形式): 用户账户的文本描述(备注字段): 用户HOME目录的位置: 用户默认shell

/etc/shadow文件 : 只有root用户可以访问。

登录名: 加密后的密码: 自上次修改密码后过去的天数(自1970年1月1日开始): 多少天后才能修改密码: 多少天后必须更改密码: 密码过期前多少天提醒用户更改密码: 密码过期后多少天禁用用户账户: 用户账户被禁用的日期(自1970年1月1日到当天的天数): 预留字段

添加新用户: useradd

删除用户 : userdel

修改用户 : usermod(修改用户账户字段,可以制定主要组以及附加组的所属关系), passwd(修改已有用户的密码), chpasswd(从文件中读取登录名密码对,并更新密码), chage(修改密码的过期日期), chfn(修改用户账户的备注信息), chsh(修改用户的默认登录shell)

/etc/group文件 : 文件格式 : 组名: 组密码: GID: 属于改组的用户列表

创建组 : groupadd         

修改组 : groupmod

文件权限 : 例 lrwxrwxrwx 1 root root 6 Oct 3 03:54 link_nusers -> nusers

第一个字符代表了对象类型 : -代表文件, d代表目录, l代表链接, c代表字符型设备, b代表块设备, n代表网络设备。3组3字符编码分别代表了对象的属主、对象的属组、系统其他用户的权限,r可读,w可写,x可执行,其中-是0,x是1,w是2,r是4。文件的全权限值是666,目录是777.umask值是掩码值,需要从对象的全权限值中减去,即666-022=644。

chmod 760 myfiles或者 chmod [ugoa…] [+-=] [rwxXstugo…]

u代表用户,g代表组,o代表其他,a代表上述所有。

+表示在现有权限基础上增加权限,-表示在现有权限上移除权限,=表示将权限设置成后面的值

X如果对象是目录或者它已有执行权限,赋予执行权限; s运行时重新设置UID或GID; t保留文件或目录; u将权限设置为属主一样; g将权限设置为跟属组一样; o将权限设置为跟其他用户一样。

改变所属关系 : chown 改变文件的属主。 chgrp改变文件的默认属组。

共享文件(某一个组内的所有用户):
 

mkdir testdir ##创建共享目录

chgrp shared testdir #改变目录所在组

chmod g+s testdir #在属组的权限上增加运行时重新设置UID或者GID

umask 002 #设置文件对属组可写

cd testdir ; touch testfile #进入目录创建文件

六、管理文件系统


创建分区 : fdisk

创建文件系统(格式化) : mkfs.vfat(格式化u盘,文件系统fat), mkfs.ext3(文件系统ext3)

七、安装软件程序

使用aptitude 管理软件包

在命令行输入aptitude

快速显示某个特定包的详细信息 aptitude show package_name

得到特定软件包相关的所有文件的列表 dpkg -L pageage_name

找到特定的软件包 aptitude search package_name

安装软件包 aptitude install package_name

更新软件 aptitude safe-upgrade

卸载软件 aptitude purge package_name 或 aptitude remove package_name

区别remove选项不删除数据和配置文件,purge会删除全部。

八、构建基本脚本

创建shell脚本文件

格式一般为 : #! /bin/bash

环境变量: 在变量名前加美元符($)来使用这些环境变量。

用户变量: var1=10,用户变量可通过美元符引用,在shell脚本结束时会被删除掉。

命令替换:将命令输出赋给变量:反引号字符(`)或者$()

重定向

输出重定向 : >(写入文件) , >>(追加)

输入重定向 : <(基本输入) , <<(内联输入重定向)

管道(  |  )

将一个命令的输出作为另外一个命令的输入,如 ls -l | more

执行数学运算

expr命令 : expr 1 \* 2 , expr 1 + 5

使用放括号 : var1=$[1 + 5] var2=$[$var1 * 2]

浮点: 使用bc计算器,设置小数位: scale=4

在脚本中使用bc,基本格式:

variable=$(echo “options; expression” | bc)

在bash计算器中创建的变量只能在bash计算器中有效,不能在shell脚本中使用

退出脚本

查看退出状态码 : $?(0表示默认正常退出)

exit命令:允许在脚本结束时指定一个退出状态码,如 exit 5

九、使用结构化命令

if语句

if语句会运行if后面的那个命令,如果该命令的退出状态码是0,then部分的命令会被执行,如果是其他值,then部分不会被执行

  • 基本格式 :
if command1
then 
    command
fi
  • if-then-else语句基本格式:

if command

then command

else command

fi
  • 或者 :
if command

then command

elif command

then command

fi

test命令

如果test命令中列出的条件成立,test命令就会退出并返回退出状态码0.如果变量中没有内容,退出状态不为0.基本格式:

test condition

  • 在if-then语句中的用法
if test condition

then commands

fi
  •  另外一种方法 :
if [ condition ] ####注意空格

then command1

fi

数值比较和字符串比较

#! /bin/sh
##数值比较
# n1 -eq n2  检查n1是否与n2相等 (equal)
# n1 -ge n2  检查n1是否大于或等于n2 (great equal)
# n1 -gt n2  检查n1是否大于n2 (greater than)
# n1 -le n2  检查n1是否小于或等于n2 (less equal)
# n1 -lt n2  检查n1是否小于n2 (less than)
# n1 -ne n2  检查n1是否不等于n2 (not equal)
##字符串比较
# str1 = str2 检查str1是否与str2相同
# str1 != str2 检查str1是否与str2不同
# str1 < str2 检查str1是否比str2小
# str1 > str2 检查str1是否比str2大
# -n str1 检查str1的长度是否非0
# -z str1 检查str1的长度是否为0
value1=10
value2=a
if [ $value1 -gt 5 ]
then 
    echo "the test value $value1 is greater than 5"
fi

if [ $value1 \< $value2 ]  #注意这里需要转义
then
    echo "$value1 is less than $value2"
else
    echo "$value1 is greater than $value2"
fi

文件检查

 #! /bin/bash
 ##文件比较
 # -d file          检查file是否存在并是一个目录
 # -e file          检查file是否存在
 # -f file          检查file是否存在并是一个文件
 # -r file          检查file是否存在并可读
 # -s file          检查file是否存在并非空
 # -w file          检查file是否存在并可写
 # -x file          检查file是否存在并可执行
 # -O file          检查file是否存在并属当前用户所有
 # -G file          检查file是否存在并且默认组与当前用户相同
 # file1 -nt file2  检查file1是否比file2新
 # file1 -ot file2  检查file1是否比file2旧
```
```

file=/root/Desktop/Scripts
if [ -d $file ]
then 
    echo "this is a directory"
fi

复合条件测试

[ condition1 ] && [ condition2 ]  ## 逻辑与

[ condition1 ] || [ condition2 ]  ## 逻辑或

if-then 高级特性

用于数学表达式的双括号用于高级字符串处理功能的双方括号

#!/bin/bash
##双括号命令符号
# val++  后增,    val--  后减,    ++val  先增,    --val  先减
# !  逻辑求反,    ~  位求反,      **  幂运算,    <<  位左移
# >> 位右移,     &  位布尔和,    |  位布尔或,  && 逻辑和,  || 逻辑或

##双方括号   [[ expression ]] 
#  expression使用test命令中采用的标准字符串比较,同时还提供了模式匹配

var1=4
var2=3
((var3=$var1 & $var2))
if [ $var3=0 ]
then 
    echo "$var1 & $var2 is equal 0 "
fi
if [[ $USER == r* ]]
then 
    echo "Hello $USER"
fi

case命令

在一组可能的值中寻找特定值(相当于switch)

  • 基本格式
case variable in 
        pattern1 | patter2)    command1;;
        pattern3) command2;;
        *) default commands;;
easc
#!/bin/bash

case $USER in
    root | barbara)
        echo "Welcome, $USER"
        echo "Please enjou you visit";;
    testing)
        echo "Special testing account";;
    *)
        echo "sorry,you're not allowed here";;
esac

十、更多结构化命令

for命令

  • 基本格式 :
for var in list

do

commands

done
#! /bin/bash
##读取列表中的值
# list="Alabama Alaska Arizona"
## 读取复杂值 
# list="I don\'t know if this\'ll work"   #单引号转义
## 从变量读取列表
# list="Alabama Alaska Arizona"
# list=$list "Connecticut"   # list="Alabama Alaska Arizona Connecticut"
## 从命令读取值
# list="/root/Desktop/Scripts/state"
# for state in $(cat $list)
## 更改字段分割符
# 默认分割符 : 空格、制表符、换行符
# 更改IFS的值: IFS=$'\n',只能识别换行符
## 用通配符读取目录
# for file in /root/Desktop/Scripts/*
# example1:
file=state
IFS=$'\n'
for state in $(cat $file)
do 
    echo "$state"
done

# example2:
for (( a=1,b=10 ; a<=10 ; a++,b--))
do 
    echo "$a-$b"
done
  • C语言风格for命令格式 :
for (( variable assignment ; condition ; iter))

while命令

它会在每次迭代的一开始测试test命令,在test命令返回非零退出状态码时,while命令会停止执行。格式 :
 

while test_command

do

other commands

done
#!/bin/bash
## 在while中可以使用多个测试命令
var1=10
while echo $var1           ##第一个测试命令
              [ $var1 -ge 0 ] ##第二个测试命令
do
    echo "This is inside the loop"
    var1=$[ $var1 - 1 ]
done

until命令

和while命令工作方式完全相反,until命令要求你制定一个通常返回非零推出状态码的测试命令,只有测试命令的退出状态码不为0,才会执行循环中列出的命令。一旦测试命令返回了退出状态码0,循环结束。基本格式:

until test_command

do

other commands

done


用法同while相同。

其他知识:

#! /bin/bash
## 循环文件处理
IFS.OLD=$IFS ##保存IFS值
IFS=$'\n'
for entry in $(cat /etc/passwd)
do
    echo "Values in $entry -"
    IFS=:
    for value in $entry
    do 
        echo "    $value"
    done
done

 

## break n: 命令可以跳出内部和外部循环,n默认为1,表示跳出当前循环,如果将n设为2,break命令会停止下一级的外部循环
## continue n: 命令允许通过命令行参数指定要继续执行哪一级循环
## 处理循环输出: 可以对循环的输出使用管道或进行重定向,这可以通过在done命令后添加一个处理命令来实现

for file in /root/Desktop/Scripts/*
do 
    if [ -f "$file" ]
    then
        echo "$file is a file"
    fi
done > output.txt
# done | sort > output.txt


 

 


版权声明:本文为liouyi250原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。