shell编程增强

简介: shell编程增强

一 shell


[3] shell中判断的使用


(1)对数字的判断
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
(2)逻辑运算
&& ---> -a
|| ---> -o
! ---> !
(3)判断字符串
-z 判断字符串是否为空
-n 判断字符串是否不为空
=或者== 判断字符串是否相等
!= 判断字符串是否不相等
\> 判断是否大于
\< 判断是否小于
(4)对文件类型的判断
-e:判断文件是否存在
-s:判断文件是否存在,并且判断文件是否为空
-b:判断文件是否存在,并且判断文件是否是块设备文件
-c:判断文件是否存在,并且判断文件是否是字符设备文件
-d:判断文件是否存在,并且判断文件是否是目录
-f:判断文件是否存在,并且判断文件是否是普通文件
-L:判断文件是否存在,并且判断文件是否是链接文件
-S:判断文件是否存在,并且判断文件是否是套接字文件
-p:判断文件是否存在,并且判断文件是否是管道文件
(5)对文件权限的判断
-r:判断是否具备可读权限
-w:判断是否具备可写权限
-x:判断是否具备可执行权限


#!/bin/bash
read -p "input filename> " file
if test -e "$file" -a -n "$file"
then
  if test -L $file
  then
  echo "这是链接文件"
  elif test -f $file
  then
  echo "这是普通文件"
  elif test -d $file
  then
  echo "这是一个目录"
  elif test -c $file
  then
  echo "这是字符设备文件"
  elif test -s $file
  then
  echo "这是套接字文件"
  elif test -p $file
  then
  echo "这是g管道文件"
  fi
else
  echo "file not found ,please check input filename"
fi


练习`


向脚本输入一个文件的名字,判断输入是否不为空,如果不为空,判断是否是普通文件 如果是普通文件,再

判断文件是否具备写的权限如果文件不具备就添加写的权限,向文件尾部追加hello world这句话。


#!/bin/bash
read -p "input filename >" file
if [ -n "$file" ]
then
  if [ -f "$file" ]
  then
  if [ ! -w "$file" ]
  then
    chmod u+w $file
  fi
  echo “hello world” >> $file
  else
  echo "输入的不是一个普通文件"
  exit 1
  fi
else
  echo "input try again"
  exit 1
fi


[4] case in语句


case 变量 in
匹配选项1)
语句1;
匹配选项2)
语句2;
匹配选项n)
语句n;
匹配选项的格式:
*:匹配任意字符
[字符1字符n]:匹配[]内部任意一个字符
“y”|"yes" :如果有多个可以使用|
,|.|:|\"|?: 注意使用者转义字符


#!/bin/bash
read -p "input number >" num
case $num in
  1)
  echo "星期一"
  ;;
  2)
  echo "星期二"
  ;;
  *)
  echo "输入错误"
  ;;
esac


#!/bin/bash
read -p "input char > " cc
case $cc in
  [0-9]|"10")
  echo "这是一个数字" 
  ;;
  [a-zA-Z])
  echo "这是一个字母"
  ;;
  ,|.|:|\"|?)
  echo "这是一个标点符号"
  ;;
  *)
  echo "输入错误"
  ;;
esac


[5] 循环语句


(1)while循环




while 循环条件
do
循环体
done
#!/bin/bash
sum=0;
i=0;
while [ $i -le 100 ]
do
  ((sum += i++))
done
echo $sum


练习2


在用户家目录下创建两个目录file-dir和dir-dir

如果目录已经存在了,就不需要创建了,询问用户是否需要对目录清空[Y/N] y n,yes no

输入一个路径,判断这个路径是否存在,如果存在,将这个目录下的文件拷贝到file-dir,将目录拷贝到

dir-dir下

统计拷贝的文件和目录的个数,将文件的个数和目录的个数打印出来


#!/bin/bash
arr=("/home/jsetc/file-dir" "/home/jsetc/dir-dir")
i=0
while test $i -lt ${#arr[@]}
do
  if [ -d ${arr[$i]} ]
  then
  echo -n "是否需要清空${arr[$i]} 目录【Y/N】}"
  read chose
  case $chose in
    "Y"|"y"|"yes"|"YES")
    echo "正在清空${arr[$i]}中..."
    rm -rf ${arr[$i]}/*
    echo "$arr[$i]已经被清空了..."
    ;;
    "N"|"n"|"no"|"NO")
    echo "${arr[$i]}目录下的内容没有被清空..."
    ;;
    *)
    echo "输入错误"
    ;;
  esac
  else
  mkdir ${arr[$i]}
  echo "新建了 ${arr[$i]}这个目录"
  fi
  ((i++))
done
while true
do
  file=0
  dir=0
  read -p "输入的要操作的路径>" path
  if [ -d $path ]
  then
  arr1=(`ls $path`)
  j=0
  while test $j -lt ${#arr1[@]}
  do
    if [ -f $path/${arr1[$j]} ]
    then
    echo "正在拷贝 ${arr1[$j]}文件..."
    cp $path/${arr1[$j]} ${arr[0]}
    ((file++))
    elif [ -d $path/${arr1[$j]} ]
    then
    echo "正在拷贝 ${arr1[$j]}目录..."
    cp $path/${arr1[$j]} ${arr[1]} -r
    ((dir++))
    fi
    ((j++))
  done
  elif [ "$path" = "quit" ]
  then
  echo "退出程序..."
  exit 1
  else
  echo "输入的路径不存在,请重试..."
  continue
  fi
  echo "拷贝文件的个数:$file"
  echo "拷贝目录的个数:$dir"
done


(2)for 循环


1. 用法1(c风格)

for((i = 0 ; i < 100;i++))
do
  循环体
done


1. 用法2(shell特有的for循环)

for 变量 in 单词列表
do
  循环体
done
注意:单词列表的格式
格式1: Ubuntu windows ios redhat
格式2: `ls`
格式3:{start..end}
格式4:如果in和后面的单词列表是缺省的,此时单词列表是命令行的参数


#!/bin/bash
for var in ubuntu windows ios iphone
do
  echo $var
done


#!/bin/bash
for var in `ls`
do
  echo $var
done


#!/bin/bash
:<<EOF
sum=0
for var in {1..100}
do
  ((sum += var))
done
echo $sum
EOF
for var in {A..Z}
do
  echo $var
done


1. select in 增强交互效果的循环语句

select 变量 in 单词列表
do
  循环体
done


#!/bin/bash
select var in windows ubuntu ios Android
do
  echo $var
done


#!/bin/bash
select var in windows ubuntu ios Android
do
  case $var in
  "windows")
    echo "welcome to windows"
    ;;
  "ubuntu")
    echo "welcome to ubuntu"
    ;;
  "ios")
    echo "welcome to ios"
    ;;
  "Android")
    echo "welcome to Android"
    ;;
  *)
    echo "error..."
    ;;
  esac
done


[6] break 和continue


和c语言语法规则一样,语法格式不一样
break n 退出n层循环
continue n 跳过n层循环,执行下一次循环


[7] goto


一般不建议使用,一般使用于错误处理


相关文章
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
Shell
Shell编程(下)
Shell编程(下)
110 1
|
2月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
47 1
|
2月前
|
Shell Linux 开发工具
|
2月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
82 12
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
53 12
|
3月前
|
Shell Linux
Shell 编程 编写hello word
Shell 编写hello word
55 5