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命令,该命令从随后的文件名剥去指定的后缀。