linux编程系列——shell

  • 查看可用shell
cat /etc/shells # 查看可用shell
cat $SHELL 		# 查看当前shell
  • 创建与执行
$ vim echo.sh
 	1 #!/bin/bash
  	2 # 注释 
  	3 echo "hello world"
 
 # 执行
 $ ./echo.sh  or bash echo.sh # 前者需要给文件执行权限 chmod +x echo.sh
  • 终端打印
# 1. echo, echo输出会自动换行
echo Welcome to deepin

# echo 彩色输出
echo -e "\e[1;31m text content \e[0m"
# 0 -- 默认颜色(黑屏白字)
# 30 -- 黑色前景	40 -- 黑色背景
# 31 -- 红色前景	41 -- 红色背景
# 32 -- 绿色前景	~
# 33 -- 黄色前景	~
# 34 -- 蓝色前景`	~
# 35 -- 紫色前景	~
# 36 -- 青色前景	~
# 37 -- 白色前景	~

# 2. printf, printf不进行自动换行
printf "hello world"
# printf 格式输出

  • 变量&环境变量
# linux中的所有变量都被当做字符串
variable_name=hello world # 变量赋值中,=左右不可以有空格
echo ${variable_name}

len=${#variable_name} # 获取变量字符长度
echo $len

declare -i a b # 申明两个int变量a,b

$HOME 	# 用户家目录
$PATH 	# 搜索路径
$PWD	# 当前工作路径
$USER  	# 当前用户
$UID	# 用户ID
$SHELL 	# 当前shell路径与名称
$0		# 当前shell路径与名称
$PS1	# 控制终端提示符
		# \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$
		# jian@jian-PC:~/Projects/C
...
  • 数组
# 索引数组
a=(10 20 30 40 50 60)
echo ${a[0]}
b[0]="test1"
b[1]="test2"
echo ${b[0]}
index=1
echo ${b[$index]}

echo ${a[*} 	# 显示数组中所有内容
echo ${a[@]} 	# 显示数组中所有内容
echo ${#a[*]} 	# 统计数组中数组个数
echo ${!a[*]} 	# 显示数组中所有下标


# 关联数组
declare -A arr
arr=([one]=1 [two]=2)
echo ${arr[*]}
echo ${!arr[*]}

  • 数学运算
# 1. 简单的数学运算,只可以做整数运算
# let ...
numb1=1
numb2=2
let numb2++
let ++numb2
let numb3=$numb2-$numb2
echo $numb3

# [ ... ]
numb3=$[numb1+numb2]
echo $numb3

# (( ... ))
$((numb1 + numb2))

# 2. 复杂的数学运算
# expr 只可以计算整数
num3=$(expr $numb1 + $numb2)
num3=`expr $numb1 + $numb2`

# bc整数小数都可运算, linux数学运算工具
echo "3 * 2.0 " | bc
num3=`echo "$num1 * $num2" | bc`

echo "10/3" | bc
echo "scale=2;10/3" | bc # 保留两位小数

echo "obase=2;$num1+$num2" | bc # 以二进制输出 规定输出进制 如obase=2, obase=10, obase=16
echo "obase=10,ibase=2;$no" | bc # ibase 规定输出进制, 规范同obase

echo "sqrt(100)" | bc # 计算算数平方根
  • 别名
# 1. alias & unalias (临时别名, 只在当前终端窗口使用,并且重启失效)
 alias old_command='new_command'
 alias ll='ls -lh'
 unalias ll
 
# 2. 在~/.bashrc 文件中添加别名,之后source ~/.bashrc

# 3.别名的安全隐患,对别名进行转义
# \command对别名进行转义,使用真正的目标命令,避免使用被替换的别名
$ \ls
  • read
echo -n "please input your name: "
read name
echo "your name is $name"

read -p "please input your name: " name
echo "your name is $name"

# 规定时间读取
if read -t 5 -p "please your passed: " passwd
then
	echo "save success"
else
	echo "overtime"
fi

# 指定字符数读取,免回车
read -n 1 -p "Are you sure[Y/N]? " answer
case $answer in
Y|y)
	echo "you input y";;
n|N)
	echo "you input n";;
*)
	echo "invalid input";;
esac

# 密码模式 -s


# 读文件 
#1. 
count=1
cat a.txt | while read line
do
	echo "line $count: " $line
	let count++
	#count=$[ $count+1 ]
done
#2.
while read line
do
	echo $line
done < a.txt

  • 日期 与 延时
# date   date --help
# 1970年0时0秒至今纪元时 date +%s
# 2000年10月1日至今的时间戳	date --date "2000-10-1" +%s

# sleep 延时
  • grep & egrep
# grep 	通配符文本内容搜索
# egrep 正则文本内容搜索
  • find
# 具体用法查看help
  • cat
# 具体用法查看help
  • awk
# awk 行列处理
  • sed
# sed 流编辑
sed '21,25d' a.txt # 将a.txt 显示删除21-27行后的内容, 但不修改文件

sed -i '21,25d' a.txt # 将a.txt 删除21-27行的内容,并修改文件
  • tr
echo "Hello" | tr "A-Z" "a-z"
echo 12345 | tr '0-9' '9876543210' # 87654
echo 87654 | tr '9876543210' '0-9' # 12345
cat a.tx | tr '\t\n' ' '
echo "Hello 123 world 456" | tr -d '0-9' # 删除数字
echo hello 1 char 2 next 4 | tr -d '0-9 \n' # 删除数字,空格
echo hello 1 char 2 next 4 | tr -d -c '0-9 \n' #  删除非数字,空格的字符集  -c 取字符集的补集
echo "very    Very   cool. Hello       World    "  | tr -s ' ' # 压缩,将连续多个空格,压缩为一个空格
  • 重定向与文件描述符
# 重定向
< > >> 
# 文件描述符 默认在终端窗口输出
# 0  标准输入
# 1  默认 标准输出重定向
# 2  标准错误重定向
echo "This is a test" 1> test.txt # 1 默认,标准输出重定向
echo "This is a test" 2> err.txt # 标准错误重定向 , 将错误信息重定向到err.txt
cat a* 2> /dev/null # 过滤错误信息。 将错我重定向到黑洞(垃圾桶)清除,不保留
cat a* 1> out.txt 2> err.txt

cat a* 1> out.txt 2> out.txt 
# 当重定向到同一文件时,简写
cat a* 2>&1 out.txt
# 再简写
cat a* &> out.txt

# tee
cat a* > out.txt | cat -n # 重定向影响到了管道
cat a* | tee out.txt | cat -n # tee重定向并且拷贝一份给管道 tee只读取标准输出不读取标准错误, 默认是覆盖, tee -a 覆盖

# exec 创建新的文件描述符
  • if & 条件判断
# 1. 文件属性条件判断
# -f 检查是否是正确的文件路径	-x 检查是否可执行文件
# -d 检查是否是目录			-e 检查文件是否存在
# -c 检查文件是不是字符设备文件	-b 检查文件是否是块设备文件
# -w  检查文件是否可写			-r 检查文件是否可读
# -L  检查文件是否为符号链接

# 2. 算数运算条件判断
# -eq 等于 		-ne 不等于
# -gt 大于	   -ge 大于等于
# -lt 小于		-le 小于等于

# 3. 字符串条件判断
# -z 判断字符串的长度是否为0
# -n 判断字符串的是否不为0
# ==
# =
# !=
# < 
# > 

# 语法1
if [ -e a.txt]; then
	echo file exists
fi

if [ 1 -eq 2]; then
	...
else
	...
fi

# 语法2
# if (( 2 < 3)); then
if ((2 < 3))
then
	echo true
fi
# if ((2 < 3)); then echo true; fi
# if let "a<b"; then echo true; fi

# if grep -q ^root /etc/passwd; then
  • 循环与循环控制
# for 循环
declare -i i s
for (( i=1; i<=100; i++))
do
	let s+=i
done

for i in {
    
    1..5}
do
	echo $i
done

for a in {
    
    a..z}
do
	echo $a
done

data="name,sex,rollno,location"
oldIFS=$IFS
IFS=","
for item in $data;
do
	echo $item
done

# while循环 until循环
declare -i i=0 s=0
while ((i<=100))
do
	let s+=i
	let i++
done

until ((i>200))
do
	let s+=i
	set i++
done

# while read 读取文件
while read line
do
	echo $line
done < a.txt

IFS=':'
while read f1 f2 f3 f4 f5 
do
	echo $f1
done < "etc/passwd"

# until
until (( i > 100 ))
do
	echo $i
	let i++
done 

# 循环控制
# break continue
  • select
select f in *
do
	echo "$REPLY, you have chosen $f"
	break
done

PS3="please chosen: " # 修改默认的提示符
oldIFS=$IFS
IFS=','	
menu="C/C++,PHP,Golang,JAVA,Python,JavaScript"
select choice in $menu
do
	echo "You have chosen: $REPLAY, selection list $choice"
	break
done
IFS=$oldFIS
  • case
read -p "input: " num
case $num in
1|2|3)
	echo " < 3";;
*)
	echo " > 3";;
esac
  • 函数
function getline()
{
    
    
	local i=1 # 局部变量
	while read line
	do
		let ++i
		echo "$i line: $line"
	done < $file
}
file="a.txt"
getline a.txt

function append()
{
    
    
	echo $1 $2 $3
	echo "$@" # 所有参数, 每个参数是独立
	echo "$*" # 所有参数, 参数是连续的
}
append a b c d e f 
  • xargs
# xargs 将标准输入 ->(转换为) 命令行参数
cat a.txt | xargs # 将多行变为一行展示
cat a.txt| xargs -n 3 # 每行显示3个
echo "abcdefdadfdaaddfd" | xargs -d d # 以d为分界展示
  • ps (用于查看进程的瞬间信息)列出1小时内占用CPU最多的进程
ps -eo comm,pcpu # 查看进程占用CPU百分比
  • top (持续监听进程信息)
  • 列出网络上活动的主机
# ping
for ip in 192.168.0.{
    
    1..255}
do
	(
	ping -c 2 $ip &> /dev/null
	if [ $? -eq 0 ];
	then 
		echo $ip is alive
	fi
	)& # 创建子shell, 用于并行执行
done
wait

# fping 
fping -a 192.168.0.1 192.168.0.255 -g 2>/dev/null # -a 打印活动主机 -g 区段

  • 统计文件行
$ sed -n '$=' a.txt
$ wc -l a.txt
$ cat a.txt | wc -l

猜你喜欢

转载自blog.csdn.net/gripex/article/details/105370539