我需要让 Bash 接受带有参数的 DOS 命令,然后将主命令转换为 Bash 命令,并且如果有任何参数,仍然使用参数。
我迷失的部分是如何将参数传递给个别案例,而不是被 *) Command Not Found 所困扰!
例如用户输入:
copy file1.txt file2.txt
用例:copy
然后应该运行 Linuxcp
命令并使用传递副本的两个参数来完成命令。
#!/bin/bash
while :
do
read INPUT_STRING
case $INPUT_STRING in
chdir|CHDIR)
cd $arg1
bash myscript.sh
;;
cls|CLS)
clear
bash myscript.sh
;;
copy|COPY)
cp $arg1 $arg2
bash myscript.sh
;;
createdir|CREATEDIR)
mkdir $arg1
bash myscript.sh
;;
delete|DELETE)
rm $arg1
bash myscript.sh
;;
dir|DIR)
ls
bash myscript.sh
;;
move|MOVE)
mv $arg1 $arg2
bash myscript.sh
;;
print|PRINT)
echo $arg1
bash myscript.sh
;;
quit|QUIT)
break
PS1="n01396736@cisvm-cop4640-2:~$ "
;;
rename|RENAME)
mv $arg1 $arg2
bash myscript.sh
;;
type|TYPE)
cat $arg1
bash myscript.sh
;;
*)
echo "Command Not Found!!"
bash myscript.sh
;;
esac
break
done
答案1
感谢罗米亚和迈克尔·普罗科佩克为我指明了正确的方向。这就是我最终得到的结果,它的工作原理就像预期的那样。如果您发现任何错误或我可以改进代码,请告诉我。这是我创建的第一个 Linux 脚本。
#!/bin/bash
counter=1
while : [$counter -lt 2]
do
read -p 'Your Name Here > ' cmd "arg"
case $cmd in
chdir|CHDIR)
cd $arg
;;
cls|CLS)
clear
;;
copy|COPY)
cp $arg
;;
createdir|CREATEDIR)
mkdir $arg
;;
createfile|CREATEFILE)
touch $arg
;;
delete|DELETE)
rm $arg
;;
dir|DIR)
ls
;;
move|MOVE)
mv $arg
;;
print|PRINT)
echo $arg
;;
quit|QUIT)
counter=2
;;
rename|RENAME)
mv $arg
;;
type|TYPE)
cat $arg
;;
*)
echo "Command Not Found!!"
;;
esac
done
答案2
您的脚本似乎只是用替代名称替换命令名称。通过在 shell 中提供别名可以轻松完成此操作。
例如:
alias remove=rm
alias type=cat
alias dir='ls -l'
alias cls=clear
alias quit=exit
您可以将它们放入一个名为类似的文件中dos_compat
,然后bash
使用以下命令启动交互式 shell
bash --rcfile dos_compat
这将启动一个具有可用别名的新交互式 shell。使用exit
或quit
或Ctrl+D返回到原始 shell。
如果您想要实现的任何 DOS 命令比简单的别名更复杂,则需要将其实现为文件中的 shell 函数dos_compat
。其用途之一可能是自动检测文件名参数中类似于 DOS 的路径名,并将其更改为C:\
,/
或者重新排列更复杂的 DOS 命令的参数。
这样做的好处是,您仍然可以将 Unix shell 命令与 DOS 别名一起使用,并且如果您愿意,您还可以在更复杂的复合 shell 命令结构中使用 DOS 命令。
答案3
为什么不编写一个脚本,将这些 DOS 命令的别名添加到 .bashrc 中,并将这些命令映射到相应的 Bash 对应项。您还可以使用脚本轻松删除这些条目,这样您基本上就可以将 bash 环境从一台计算机迁移到另一台计算机。
您也可以这样做,以便它将原始的 .bashrc 移动到 .bashrcbak 并将您的文件放在适当的位置,然后当您想要恢复时,只需将其移回原来的位置即可。
或者您可以创建单个会话别名,如下所示:https://unix.stackexchange.com/a/148928/321418