shell基本知识

xiaoxiao2021-02-28  93

shell类型

函数

主过程

要调用才能执行

<<!

....

...

...

!

多行注释

#或//单行注释

#!/bin/bash echo "abcdefg........" syshello syshello() {     echo "enter function....."     ls -l     echo "over  function....." } echo "start......." syshello echo "exit......"

1、文本编辑: gedit (图形界面可以用) vi  vim vim 文件名  (文件存在,打开文件  文件不存在:创建文件(文件非空)) 退出: shift+: 1、q  退出 不保存退出 2、q! 强制退出   不保存 3、w  保存文件内容 4、wq 保存退出    ====   x vim 三种模式: 1、命令行模式:刚开打的状态 2、底行模式:输命令的状态 3、插入模式(编辑模式):可以编辑文件 命令行 --->   底行: shift + : 底行   --->   ESC键 命令行 --->   插入行: i(I) : 在光标的前面插入   insert   I: 在一行的开头进行插入 a(A) : 在光标的后面插入   append   A: 在一行的结束进行插入 o(O) : 在下面另起一行              O: 在上面另起一行 插入行 --->   命令行:ESC键 底行模式: 设置行号显示:set nu(number) 取消行号显示:set nonu 语法高亮:    syntax on(开启)  syntax off(关闭) vim 的配置文件 /etc/vimrc 命令行与底行模式 跳转: G    跳到最后一行 gg   跳到第一行 nG   跳到 n 行 复制: yy   复制当前行数据 yw   复制一个单词 y$   复制光标位置 到 这一行最后的所有数据 删除: dd   删除一行 dw   删除一个单词 d$   删除光标位置开始后面所有数据 D    同上 x    删除一个字符   delete 粘贴: p n+(yy,yw,dd,p) 重复多少次 撤销: u 底行模式: 查找: 向下查找:/ + 查找的内容   /define  n 下一个  N 上一个 向上查找:?+ 查找内容     ?define 替换: s/old/new     : 当前行替换,替换当前行的第一个 s/old/new/g   : 整行替换 %s/old/new/g  : 全文替换 n,ms/old/new  : 替换 n 到 m 行数据 s/old/new/gc  : 替换前提示 r ; 替换一个字符 R : 替换后面的所有 另存为:w filename    1、shell: 打开一个文件,后缀名 sh; 写:文件第一行写: #!/bin/bash 表明所用的脚本类型  赋予可执行的权限  chmod +x  执行: 1、./文件 2、sh   文件 3、bash 文件 if 条件 then     执行语句1 elif then 执行语句2 else 执行语句3 fi  结束标志 grep ls -l | grep root awk ls -l | awk '{print $1}' ls -l | awk -Froot '{print $1}' ls -l | awk -Froot '{print $NF}'

第一行写#!/bin/bash,表明所有脚本类型

打开一个文件,后缀名.sh

bin目录下可以直接执行

usr/bin普通用户用

执行:

1. ./ 文件

2. sh 文件

3. bash 文件

清除变量unset 变量 终端关掉结束

#环境内部定义的局部变量

复制等号左右不能空格,字符串,取值包含空格,用双引号

环境变量那里都能用,一个终端内,read 变量名(键盘输入)

readonly 变量名,无法改变此值

PATH=$PATH:/home

etc 改,全终端有效

name=hhh

echo $name

export name 导成环境变量 次派生出来终端才有效

env所有环境变量

#!/bin/bash echo "#:$#" echo "@:$@" echo "*:$*" echo "0:$0" echo "1:$1" echo "2:$2" echo "3:$3" echo "4:$4" echo "hello"

#!/bin/bash num1=$1 operate=$2 num2=$3 result=$((num1 $operate num2)) echo $result

$?上一个命令的执行结果,

echo $? 正确0

错误非0,错误代码

expr 7+9  

expr 7\*9  *命令行参数,需要转义,读不用

echo $((表达式))这里乘法不需要转义

$((num1 * num2))

.demo7.sh 4 + 5

条件test tset n1 参数 n2

成功执行,真 返回0

错误,返回1

if条件

then 执行语句

fi

(结束标志)

elif 条件

then 执行语句

else

执行语句

数值测试

-eq 等于则为真

-ne 不等于

-gt 大于

-ge 大于等于

-lt小于

-le小于等于

路口参数检查

#!/bin/bash << A if test $# -ne 3 then     echo "Usge:./demo9.sh num1 operate num2"     exit 1 fi A if [ $# -ne 3 ] then     echo "Usge:./demo9.sh num1 operate num2"     exit 1 fi      num1=$1 operate=$2 num2=$3 result=$((num1 $operate num2)) case “$#” in    0) echo “输入了0个参数” ;;    1) echo “输入了1个参数” ;;    *) echo “输入了多个参数”;;  esac 每个分支条件后必须以两个分号结尾 echo $result

文件测试

while条件为真执行

until条件为假才执行

tiem命令 执行时间

管道| 管道自负

date 时间

date +%k小时

cp /etc/my.conf  >/dev/null  2>&1 /dev/null  空设备 此句命令的结果是: cp命令没有目标文件,应该输出错误。  2>&1表示错误重定向指向标准输出。 >/dev/null又使标准输出重定向到空,就是不要输出信息 即:一个错误的命令执行,什么功能都不实现,且没有任何信息或错误提示输出。   1)command >file 2>file 2)command >file 2>&1  有什么区别?      1)的写法,stdout和stderr都直接送到file中, 会出现两个同抢占file的管道,file会被打开两次,stdout和stderr输出的信息会互相覆盖。     2)的写法将stdout直接送向file, stderr继承1的管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。     从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,常用command > file 2>&1 这样的写法。 

编写一个名为chname的程序,将当前目录下所有的.txt文件更名为.doc文件。

 #! /bin/sh - for file in *.txt do   leftname=`basename $file .txt`   mv $file $leftname.doc done 说明:  (1)在Linux系统中不支持mv *.txt *.doc这样的更名命令形式,如果需要将文件成批地更名最好编写一个shell脚本文件。  (2)在for语句的参数列表中使用了“*”通配符。  (3(在程序中用到basename命令,该命令从随后的文件名剥去指定的后缀。  

转载请注明原文地址: https://www.6miu.com/read-56703.html

最新回复(0)