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 Linux Shell
【Shell 编程指南 日期命令】Date命令:显示与设置系统时间和日期
【Shell 编程指南 日期命令】Date命令:显示与设置系统时间和日期
88 0
|
3月前
|
Shell C++ 开发者
【Shell 编程指南】Shell运算操作符之$[]详解
【Shell 编程指南】Shell运算操作符之$[]详解
39 0
|
1天前
|
Shell 数据处理 C++
【震撼揭秘】Python正则VS Shell正则:一场跨越编程边界的史诗级对决!你绝不能错过的精彩较量,带你领略文本处理的极致魅力!
【8月更文挑战第19天】正则表达式是文本处理的强大工具,在Python与Shell中有广泛应用。两者虽语法各异,但仍共享许多基本元素,如`.`、`*`及`[]`等。Python通过`re`模块支持丰富的功能,如非捕获组及命名捕获组;而Shell则依赖`grep`、`sed`和`awk`等命令实现类似效果。尽管Python提供了更高级的特性和函数,Shell在处理文本文件方面仍有其独特优势。选择合适工具需根据具体需求和个人偏好决定。
|
16天前
|
监控 Shell Linux
探索Linux操作系统下的Shell编程之魅力
【8月更文挑战第4天】本文旨在通过一系列精心设计的示例和分析,揭示在Linux环境下进行Shell编程的独特之处及其强大功能。我们将从基础语法入手,逐步深入到脚本的编写与执行,最终通过实际代码案例展现Shell编程在日常系统管理和自动化任务中的应用价值。文章不仅适合初学者构建扎实的基础,同时也为有一定经验的开发者提供进阶技巧。
29 11
|
1月前
|
JavaScript 前端开发 Shell
Shell 脚本编程保姆级教程(上)
Shell 脚本编程保姆级教程(上)
|
23天前
|
Shell Linux Perl
shell 编程中 awk ,wc ,$0,$1 等 命令的使用总结
shell 编程中 awk ,wc ,$0,$1 等 命令的使用总结
20 0
|
23天前
|
Shell Linux
Shell 脚本编程学习
Shell 脚本编程学习
20 0
|
1月前
|
Shell
Shell 脚本编程保姆级教程(下)
Shell 脚本编程保姆级教程(下)
|
1月前
|
存储 Unix Shell
Shell编程基础与实用技巧
Shell编程基础与实用技巧
|
2月前
|
机器学习/深度学习 Unix Java
技术笔记:Linux之Shell脚本编程(一)
技术笔记:Linux之Shell脚本编程(一)
36 0