使用shell设计脚本,实现通过命令行界面接收用户的输入,执行用户输入的命令,判断命令是否有效,支持管道和重定向命令,命令执行结果或出错信息在命令行界面显示,提供内部命令用于显示使用帮助和退出本Shell程序
时间: 2024-03-14 16:42:49 浏览: 77
一、Linux操作命令和常用工具
这是一个比较完整的Shell脚本示例,它可以接收用户的输入并执行命令,支持管道和重定向,内置了帮助和退出命令。
```
#!/bin/bash
# 内部命令:显示帮助信息
function show_help {
echo "Usage: myshell [-h] [-c command]"
echo "A simple shell program."
echo ""
echo "Options:"
echo " -h Display this help message and exit."
echo " -c command Execute the given command and exit."
}
# 内部命令:退出Shell程序
function exit_shell {
echo "Bye!"
exit 0
}
# 主程序
while getopts ":hc:" opt; do
case $opt in
h)
show_help
exit 0
;;
c)
command="$OPTARG"
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
if [ -n "$command" ]; then
# 执行单个命令
eval "$command"
else
# 进入交互模式
while true; do
# 显示Shell提示符
printf "\033[1;32mmyshell $ \033[0m"
# 读取用户输入
read input
# 判断是否为空命令
if [ -z "$input" ]; then
continue
fi
# 判断是否为内部命令
case $input in
"help")
show_help
;;
"exit")
exit_shell
;;
*)
# 解析命令中的管道和重定向符号
commands=()
input=$(echo "$input" | sed 's/^[ \t]*//;s/[ \t]*$//') # 去除首尾空格
while true; do
if echo "$input" | grep -q -E "[|<>]"; then
# 存在管道或重定向符号
symbol=$(echo "$input" | grep -o -E "[|<>]")
command=$(echo "$input" | awk -v symbol="$symbol" '{split($0,a,symbol); print a[1]}')
input=$(echo "$input" | awk -v symbol="$symbol" '{split($0,a,symbol); print a[2]}')
commands+=("$command")
commands+=("$symbol")
else
commands+=("$input")
break
fi
done
# 执行命令
eval "${commands[@]}"
;;
esac
done
fi
```
这个脚本使用了getopts命令来解析命令行参数,实现了-h和-c选项;使用了while循环实现了交互模式;使用了sed命令去除输入命令的首尾空格,并使用grep和awk命令解析命令中的管道和重定向符号;最后使用eval命令执行命令。在内部命令中,show_help函数用于显示帮助信息,exit_shell函数用于退出Shell程序。
阅读全文