shell的一些使用

标签: shell

1、for循环

1.1数字性的循环

乘号前用反斜杠,expr说明后面的式子为表达式i*3+1

#!/bin/bash
 
for((i=1;i<=10;i++));
do 
echo $(expr $i \* 3 + 1);
done

1.2字符性循环

输出当前目录下所有文件的文件名,用ls表示当前目录

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

1.3路径查找

以file表示变量,in后接目录地址或者是某种类型的文件

example1:显示制定路径下的文件的文件名

#!/bin/bash
 
for file in /proc/*;
do
echo $file ;
done

example2:显示当前路径下所有sh格式的文件

#!/bin/bash
 
for file in $(ls *.sh)
do
echo $file ;
done

高级应用:对当前路径下所有ABCD格式的文件执行相应的操作,可以把ls换成指定的目录

#!/bin/bash
#Batch convert json file
 
source activate labelme
for file in `ls `
do
   if [[ $file =~ \.json$ ]];then    # [[ $file =~ \.ABCD$ ]] 匹配以.ABCD结尾的文件
     python ~/labelme-master/labelme/cli/json_to_dataset.py $file	
   fi
done

 

2、echo

让你的终端输出文字显示绿色背景

echo -e "\e[1;42m=============== Dataset_preparation ===============\e[0m"

让你的终端输出文字变成红色

echo -e "\e[1;31m--Now convert the valid dataset...\e[0m"

效果图

 

3、read

直接read变量,如read var

 

4、case

example:判断用户输入是Y还是N来执行相应的操作

read comd
case $comd in
	yes|y|Y)
	sleep 3s
	echo "yes"
	;;
	no|n|N)
	echo "no"
	;;
esac

 

5、if

5.1单分支if语句

if 判断条件;then
    statement1
    statement2
    .......
fi

5.2if-else

if 判断条件;then
    statement1
    statement2
    .....
else
    statement3
    statement4
fi

5.3多分支

if 判断条件;then
    statement1
    statement2
    .....
elif 判断语句;then
    statement3
    statement4
else
    statement5
fi

1)判断条件应该加中括号[],表示条件测试,这里空格很重要,注意在'['后面和']'前面都必须要有空格

2)在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。

3)if判断中对于变量的处理,需要加引号,比如[ -n "$var" ]

4)如果只单独使用>或者<号,系统会认为是输出或输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转义

字符串判断

[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真

[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真

[ STRING1 ]  如果字符串不为空则返回为真,与-n类似

[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真

[ STRING1 != STRING2 ] 如果字符串不相同则返回为真

[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。

[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。

 

数值判断

[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=

[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>

[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>

[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=

[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<

[ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=

 

逻辑判断

[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。

[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。

[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。

[ ] || [ ] 用OR来合并两个条件

[ ] && [ ] 用AND来合并两个条件

 

if应用:

判断目录$tmpDir是否存在,不存在就新建一个

if [ ! -d "$tmpDir"]; then

  mkdir "$tmpDir"

fi

 

判断普通文件$tmpDir是否存,不存在就新建一个

if [ ! -f "$tmpDir" ]; then

  touch "$tmpDir"

fi

 

判断$tmpDir是否存在,且是否具有可执行权限

if [ ! -x "$tmpDir"]; then

  mkdir "$tmpDir"

chmod +x "$tmpDir"

fi

 

是判断变量$tmpDir是否有值

if [ ! -n "$tmpDir" ]; then

  echo "$tmpDir is empty"

  exit 1

fi

 

判断两个变量是否相等

if [ "$var1" = "$var2" ]; then

  echo '$var1 eq $var2'

else

  echo '$var1 not eq $var2'

fi

 

测试退出状态:

if [ $? -eq 0 ];then

echo 'ok'

fi

 

if利用read传参判断

#!/bin/bash

read -p "please input a score:" score

echo -e "your score [$score] is judging by sys now"

 

if [ "$score" -ge "0" ]&&[ "$score" -lt "60" ];then

echo "sorry,you are lost!"

elif [ "$score" -ge "60" ]&&[ "$score" -lt "85" ];then

echo "just soso!"

elif [ "$score" -le "100" ]&&[ "$score" -ge "85" ];then

echo "good job!"

else

echo "input score is wrong , the range is [0-100]!"

fi

 

判断文件是否存在

#!/bin/sh

today=`date -d yesterday +%y%m%d`

file="apache_$today.tar.gz"

cd /home/chenshuo/shell

if [ -f "$file" ];then

echo "OK"

else

echo "error $file" >error.log

mail -s "fail backup from test" [email protected] <error.log

fi

 

 

number的比较:

if [ "$num" -gt "150" ]

echo "$num > 150"

fi

原文链接:加载失败,请重新获取