概述
shell 命令
菜鸟链接——shell教程
一、基础
1.命令基础
命令历史查看
history [-c清空]
命令别名查看 和设置
alias
alias myls='ls -a'
2.通配符
通配符“*”:
ls -l test.* #表示任意多个,全部
通配符“?”:
ls -l test?.? #任意1个字符
ls -l test.??? ##任意3个字符
“[ ]”:
ls -l test[0-9].txt #范围中一个字符
3.命令后台发送与作业控制
命令后台运行:命令脱离命令行交互程序的控制而独立运行
命令作业控制:指系统对于命令作业的某种任务安排
#在原有命令末端使用“&”符号即可将该命令发送至后台运行
sleep 1000&
jobs #查看当前的后台作业任务
bg %n #将当前命令作业切换到后台
fg %n #将第n后台作业切换到前台
二、shell 变量
- shell变量:是shell程序在内存中存储数据信息的容器
color=red #变量的设置,不能加空格
echo $color ball #变量的引用,一定要加$
echo ${color}ball
- 自定义变量,首字母大写
Day=Sunday
echo "Today is ${Day}."
-
环境变量:系统中用来存储环境信息数据的变量,通常系统配置初始提供。 使用:变量命名被约束,全大写
-
export #可以将当前shell环境中的环境变量导出到子shell中
-
环境变量可以保存在配置文件 ~/.bashrc 中
-
常用环境变量:PATH变量,PS*系列变量
-
PATH:存储系统命令所在路径,通常为绝对路径
bash #新建shell env #查看环境变量 less /etc/bash.bashrc less /etc/profile less ~/.profile less ~/.bashrc #一般讲变量添加至此 PATH=/home/iotek/bin:$PATH #PATH变量设置 echo $PATH #引用。以“:”分隔
其他环境变量
环境变量PS1存储命令行的提示符
环境变量PS2存储命令行的换行符
-
echo $PS1
PS1='u:@$' #u为用户
-
预定义变量
预定义变量:用来存储shell程序运行过程中的状态信息
- 无需设置,只能引用
$$ #存储当前进程的进程号信息 $0 #存储当前进程的进程名信息 $? #存储当前命令的返回值信息,返回“0”表示运行成功 $! #存储最后一个后台进程的进程号信息 #例如 sleep 100& #创建后台程序 kill -9 $! #关闭后台程序 jobs #查看后台
-
位置变量
位置变量 :由shell程序提供的变量,位置变量通过该程序在传递给程序时的位置顺序来引用。
$1, $2, ..., $9 #位置变量一共9个 shift #位置变量切取命令 #例test.txt中写: ls -ld $1 ls -l $1 ls $2 #终端输入: >>. test.txt /home /home/user #". test.txt"为执行文件,"/home"为"$1","/home/user"为“$2” #例test1.txt中写: ls -ld $1 ls -l $1 shift ls $2 #终端输入: >>. test.txt /home /home/user /var #". test.txt"为执行文件,"/home"为"$1","/home/user"为“$2” #在shift之后,"/home/user"为“$1”,"/var"为“$1”
三、管道与重定向
- 标准设备文件
- 标准输入文件:stdin,设备文件:/dev/stdin,文件描述符:‘0’
- 标准输出文件:stdout,设备文件:/dev/stdout,文件描述符:‘1’
- 标准错误文件:stderr,设备文件:/dev/stderr,文件描述符:‘2’
-
管道:系统提供的供命令间传递信息的设备;管道仅将前一命令的输出传递给你后一命令;shell中使用管道符 “ | ” 来表示;管道允许级联
ps aux | grep 'bash' | grep -v 'grep'
-
重定向:指将原本关联输入或输出到标准设备文件的信息重新定向到指定的磁盘文件的举措。
#标准输出重定向 ls -l test.* >output.txt # ">"覆盖重定向,会自动创建文件 ls -l test.* >>output.txt # ">>"追加重定向 #标准出错重定向 ls -l aaaaa 2>output.txt # 将出错信息覆盖至文件 ls -l aaaaa 2>>output.txt # 将出错信息追加至文件 #标准输入重定向 cat <output.txt #将文件内容输入标准输入设备 cat <<EOF #"EOF"为结束标志符 ‘文档内容’ EOF #将写的内容输入标准输入设备 #合并输出重定向:指合并标准输出和标准错误的信息输出"&" ls -l test.* filenotfound &>output.txt ls -l test.* filenotfound &>>output.txt #管道过滤信息重定向 ls -l | grep [group/user] >output.txt #利用重定向拷贝文件 cat <output.txt >output2.txt #ouput内容到了stdin里然后再到output2里 # here document使用,写入内容 cat >output3.txt <<EOF >HELLO WORLD >HELLO BITCH >EOF
四、脚本
概念:指以解释执行方式的程序语句集合体。狭义的脚本指 脚本文件
用途:批量的顺序处理命令语句以实现命令应用需求,非交互式的命令使用可提高执行效率
使用:合法编写–程序基础,正确执行–运行实例
. test.sh #内容读取到当前shell执行,bash在运行,可用来测试,在shell未写完时使用
./test.sh #真实执行,需要有可执行权限
shell 流程控制
控制结构:顺序结构,分支结构,循环结构
#!/bin/bash #声明语句解释器
ls -l /home
echo "hello iotek"
echo $0 $$
分支结构实现方式:
#&&、|| 符号级联
test -x test.sh && echo "ok" || echo "failure"
#test执行成功则输出ok test执行失败则输出fail
#严谨一点使用if-else语句
if-else方式:if-then-else-fi
#if - else 语句
if [ -x $1 ]
then
echo "ok"
else
echo "failure"
fi
./test.sh test3.sh
#elif扩展:
if [ -x $1 ]
then
echo "ok"
elif [ -x $2 ];then
echo "$2 executable"
else
echo "failure"
fi
./test.sh test1.sh test2.sh
case分支:
#case分支
Value=$1
case $Value in
a)
echo "A"
;;
b)
echo "B"
;;
*)
echo "C"
;;
esac
循环结构:
while:条件为 ‘真’ 运行,until:条件为 ‘假’ 运行
#while
count=0
while [ -x $1 ] #条件判断
do
[ $count -ge 5 ] && break #-ge = greater equal
echo "running..."
let count++
done
#until
until [ -x $1 ] #当$1不能执行时,循环体执行
do
body
done
#for-in
count=1
for var in a b c d
do
echo "loop $count"
echo "$var running..."
let count++
done
实例
#!/bin/bash
#--选出10个3的倍数,从给定的自然数开始
#-----------------------------------
read -p "input a num:" Input #输入给到Input
if [ $Input -gt 0 ] 2>/dev/null ;then
echo "count start"
else
echo "not a natrual num."
exit
fi
Num=$Input
Count=0
while [ $Count -lt 10] #less than
do
let Num2=$Num%3
if [ $Num2 -eq 0 ];then
echo "$Num"
let count++
fi
let Num++
done
五、shell函数
hello(){ echo "hello iotek" } #函数名()
function nihao(){ echo "hello" } #function 函数名()
hello #函数使用时只需书写函数名即可
#脚本的函数参数依靠位置变量来传递
function nihao()
{
echo "$1 你好"
}
#使用
nihao 海同
#输出
海同 你好
六、shell变量的替换
- 缺省替换:${Var:-value}
-
若Var变量未被设置,则临时设置为value。
${Day:-Sun}
- 强制替换:${Var:+value}
-
若Var变量已被设置,则临时设值为value
${Day:+Mon}
- 缺省赋值替换:${Var:=value}
-
若Var变量未被设置,则永久设值为value
${Today:=Sun}
- 缺省错误替换:${Var:?string}
-
若Var变量未被设置,则错误输出为string
${Torrow:?"日期错误"}
- 单次匹配替换:${Var/pattern/string}
-
若Var变量匹配pattern存在,则单次替换输出为string
${Session/Yes/yes} #将“Yes”临时替换为“yes”
- 全局匹配替换:${Var//pattern/string}
-
若Var变量匹配pattern多次,则全部替换输出为string
${Session//Yes/yes} #比如Session=YesYes,则输出为 yesyes
实现猜拳游戏的脚本程序设计
案例:石头(S),剪刀(J),布(B),三局两胜
设计:
- 循环接受用户的“出招”输入;
- 比较判断胜方为用户还是电脑,并输出胜方;
- 统计胜利次数,率先赢得两次,即最终获胜。
代码:
#!/bin/bash
Input()
{
while :
do
echo "请选择输入(J)、石头(S)或布(B)"
read Choice
case $Choice in
J|j)
echo -n "您选择的是"$Choice"剪刀,"
userChoice=0
break
;;
S|s)
echo -n "您选择的是"$Choice"石头,"
userChoice=1
break
;;
B|b)
echo -n "您选择的是"$Choice"布匹,"
userChoice=2
break
;;
*)
echo "您的输入不正确,请重新输入!"
sleep 1
;;
esac
done
}
function Judge()
{
#echo "Now --judge--"
let Num=$RANDOM%3
[ $Num -eq 0 ] && echo "电脑选择的是"J"剪刀"
[ $Num -eq 1 ] && echo "电脑选择的是"S"石头"
[ $Num -eq 2 ] && echo "电脑选择的是"B"布"
let ${User:=0}; let ${Comp:=0}
if [ $1 -eq $Num ];then
echo "本局平局!"
elif [ $1 -eq 0 ];then
if [ $Num -eq 2 ];then
echo "本局你赢了!" ;let User++
else
echo "本局电脑赢!" ;let Comp++
fi
elif [ $Num -eq 0 ];then
if [ $1 -eq 2 ];then
echo "本局你赢了!" ;let User++
else
echo "本局电脑赢!" ;let Comp++
fi
elif [ $1 -gt $Num ];then
echo "本局你赢!" ;let User++
else
echo "本局电脑赢!" ;let Comp++
fi
}
#-- main program --
clear; echo "欢迎来到剪刀、石头、布游戏!"
sleep 2; User=0;Comp=0;Round=1
while [ $Round -le 3 ]
do
sleep 2; clear
echo ">> 剪刀、石头、布第${Round}回合比赛 <<"
Input
Judge $userChoice
let Round++
[ $User -ge 2 ] && echo "恭喜,你赢得了整个比赛!"
&& exit
[ $Comp -ge 2 ] && echo "遗憾,电脑赢了整个比赛!"
&& exit
done
if [ $User -gt $Comp ]; then
echo "恭喜,你赢得了整个比赛!";
elif [ $User -lt $Comp ]; then
echo "遗憾,电脑赢了整个比赛!";
else
echo "平局!"
fi
最后
以上就是乐观哈密瓜为你收集整理的shell 命令shell 命令实现猜拳游戏的脚本程序设计的全部内容,希望文章能够帮你解决shell 命令shell 命令实现猜拳游戏的脚本程序设计所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复