如果我写一个sh file
,我想写一个脚本,输入文件夹的 3 个参数、文件名和文件类型。
例如,如果我有一个文件夹名称:folder_example --> [hello.txt] (inside it's written "Hello World")
当我运行 "./example.sh folder_example hello txt"
时会输出:"Hello world"
我想我需要将 read
与 do-while
一起使用,但我不知道确切的语法。
答案 0 :(得分:0)
试试这个:
#/bin/bash
FOLDER_NAME=${1}
FILE_NAME=${2}
FILE_EXT=${3}
# Check folder exists
if [ ! -d "${FOLDER_NAME}" ]
then
echo "Invalid folder name: ${FOLDER_NAME}"
exit 1
fi
FULL_NAME="${FOLDER_NAME}/${FILE_NAME}.${FILE_EXT}"
# Check file exists
if [ ! -f "${FULL_NAME}" ]
then
echo "Invalid file name: ${FULL_NAME}"
exit 1
fi
# SHow file contents
echo "Contents of ${FULL_NAME}:"
cat "${FULL_NAME}"
答案 1 :(得分:0)
接受的答案过于复杂,并且包含了一些违反最佳实践的内容。尤其是,您永远不应该尝试预测命令会失败并将不明确的错误消息打印到错误的流中。如果文件不存在,或者如果存在权限错误,或者如果由于磁盘故障或套接字关闭而导致读取失败,或者发生了一些其他不可预见的错误,“无效文件名”就不是有用的错误消息。就这样做:
#!/bin/sh
cat "$1/$2.$3"
这将打印合理的错误消息并以合理的返回值退出。也许您可能想要添加一些便利功能并执行以下操作:
#!/bin/sh
case $# in
0) echo "usage: $(basename $0) [directory ...] filename [extension]";;
1) cat "$1";;
2) if test -f "$1/$2"; then cat "$1/$2"; else cat "$1.$2"; fi;;
3) cat "$1/$2.$3";;
*) cat "$(IFS=/; echo "${*}" | sed 's@/\([^/]*$\)@.\1@')";;
esac
但不要试图预测 cat
可能遇到的错误。让它打印自己的错误信息。并且不要使用全大写的变量名。它让读者的眼睛受到伤害。