Shell脚本攻略之小试牛刀

shell脚本:
(1)chmod a+x script.sh         //授予所有用户script.sh的可执行权限

(2)~ 是一种简写,代表用户home目录的路径

(3)双引号中的特殊符号需要转义(使用转义字符 进行转义,加在需要转义的特殊符号前),而单引号中的却不需要

(4)Bash中,每个命令或是命令序列是通过分号或换行符来分隔的:
cmd1;cmd2
等用于:
cmd1
cmd2


(5)使用带单引号的echo时:echo '$var' 将会返回$var,而使用不带引号的echo时:echo $var,将返回变量的值

(6)打印彩色文本:
echo -e "e[1;31m This is red text e[0m"
e[1;31m将颜色设置为红色,e[0m将颜色重新置回

(7)pgrep gedit:获取gedit的进程ID,例如是13048


(8)使用cat /proc/13048/environ :获得与该进程相关的环境变量,每个变量以name=value的形式描述,彼此之间有null字符分割

可以使用 替换 将输出格式化:cat /proc/13048/environ | tr '' ' '


(9)变量:var=value(赋值操作) 不等同于 var = value(相等操作)
引用变量:$var 或者 ${var}

(10)环境变量是未在当前进程中定义,而从父进程中继承而来的变量
export命令用来设置环境变量:export PATH="$PATH:/home/chunyu/bin"


(11)检查是否为超级用户:UID是一个重要的环境变量,可以用于检查当前脚本是以超级用户还是普通用户的身份运行,root用户的UID是0
脚本实例:
#!/bin/bash

if [ $UID -ne 0 ]
then
echo "Non root user.Please run as root"
else
echo "Root user"
fi

sudo su


(12)利用let,(( ))和[ ]执行基本的算数操作,而在进行高级操作时,expr和bc这两个工具也会非常有用

let result=no1+no2 等同于 result=$[ no1 + no2 ] 等同于 result=$(( no1 + no2 )) 等同于 result=`expr no1 + no2` 这些方法只能用于整数运算,而不支持浮点数


(13)bc是一个用于数学运算的高级工具,可以进行浮点运算,进制转换,计算平方以及平方根
实例:
no=54;
result=`echo "$no * 1.5" | bc`
echo $result


(14)curl命令用于网络:
curl -v --insecure -d "login=xcxz1994&password=yu19940606!" https://github.com/session --cookie-jar cookie_file

curl https://github.com --cookie-jar cookie_file


(15)当一个命令发生错误并退回时,它会返回一个非0的退出状态;而当命令成功完成之后,它会返回数字0
退出状态可以从特殊变量$?中获得

(16)cmd 2>stderr.txt 1>stdout.txt 将stderr单独重定向到一个文件,将stdout重定向到另一个文件
cmd 2>&1 output.txt 使得stderr和stdout都被重定向到同一个文件中

(17)cat a* | tee out.txt | cat -n
tee命令接收到来自stdin的数据,它将stdout的一份副本写入文件out.txt,同时将另一份副本作为后续命令的stdin,cat -n将从stdin中接收到的每一行数据前加上行号并写入stdout

(18)可以使用stdin作为命令参数,只需要将 - 作为命令的文件名参数即可
cmd1 | cmd2 | cmd -

(19)重定向脚本内部的文本块:在cat <<EOF>log.txt与下一个EOF行之间的所有文本都会被当做stdin数据
#!/bin/bash
cat <<EOF>log.txt
LOG FILE HEADER
This is a test log file
Function;System statistics
EOF

(20)关联数组:用任意的文本作为数组索引
declare -A ass_array //声明语句将一个变量名声明为关联数组
ass_array=([index1]='val1' [index2]='val2') //利用内嵌索引-值列表法,提供一个索引-值列表
echo ${!array_var[*]} //列出数组索引

(21)创建别名:alias命令--alias命令的作用只是暂时的,一旦关闭终端就失效了
可以把创建的别名放入~/.bashrc文件中,因为每当一个新的shell进程生成时,都会执行~/.bashrc中的命令,设置完之后要开新的终端才生效
echo 'alias ins="sudo apt-get install"' >> ~/.bashrc

(22)对别名进行转义:command 字符对命令实施转义,使得我们可以执行原本的命令,而不是攻击者重命名过的命令

(23)watch命令:监测你想要的一切命令的结果变化:
watch -n 1 -d netstat -ant //每隔一秒高亮显示网络连接数的变化
watch -d 'ls -l | grep scf' //检测当前目录中scf的文件的变化
watch -n 10 'cat /proc/loadavg' //10秒一次输出系统的平均负载

(24)获取终端信息:
tput cols //获取终端列数
tput lines //获取终端行数
tput longname //打印终端名
tput cup 100 100 //将光标移动到方位(100,100)处
tput setb [0-7] //设置终端背景色
tput setf [0-7] //设置文本前景色
tput bold //设置文本样式为粗体
tput smul | tput rmul //设置下划线的起止
tput ed //删除当前光标位置到行尾的所有内容

(25)获取,设置日期和延时:

 检查一组命令运行花费的时间(运行安装pycharm以及java环境的脚本,计算运行时间):

#!/bin/bash

start=$(date +%s)
cd /etc
sudo mkdir pycharm
cd /etc/pycharm/


sudo add-apt-repository ppa:webupd8team/java  

sudo apt-get update

sudo apt-get install oracle-java8-installer -y
java -version
javac -version

sudo apt-get install oracle-java8-set-default -y


sudo echo JAVA_HOME="/usr/lib/jvm/java-8-oracle" >> /etc/environment

source /etc/environment

sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make

sudo apt-get update

sudo apt-get install ubuntu-make -y

umake ide pycharm

end=$(date +%s)
difference=$(( end - start))
echo "运行安装pycharm和java环境花费时间是 $difference 秒"

 在脚本中生成延时的方法:

#!/bin/bash

echo -n Count:
tput sc             #存储光标位置

count=0;
while true;
do
 if [ $count -lt 40 ];
 then
   let count++;
   sleep 1;                    #每次循环中,通过恢复之前存储的光标位置,在终端中打印出新的count值
   tput rc;                    #恢复光标位置的命令
   tput ed;                    #清除从当前光标位置到行尾之间的所有内容,使得旧的count值可以被清除并写入新值      
   echo -n $count;
 else exit 0;
 fi
done

原文地址:https://www.cnblogs.com/hqutcy/p/8818125.html