我正在使用bash脚本进行DBMS项目。我有一个问题No such file or directory
,但文件已经存在,它也在工作,但当我从Main_Menu
文件源此文件时,它不像预期的那样工作。有时有效,有时无效。
Drop_DB.sh:
#!/bin/bash
read -rp "Enter the name of db you want to remove: " db_name
# we use this variable as flag to check everything is ok.
error=""
# function for validations
function validation {
if [ -d "./DataBases" ]
then
error="0"
else
error="1"
echo "Error! DataBases file not exist ❌"
fi
if [ -d "./DataBases/$db_name" -a $error = 0 ]
then
error="0"
else
error="1"
echo "Error! No Database with this name: $db_name ❌"
fi
}
# Call function validation first
validation
if [ $error -eq 0 ]
then
rm -r "./DataBases/$db_name"
echo "Database: $db_name deleted successfully ✓ ✓"
else
echo "Can't complete this action ❌"
fi
List_DB.sh:
#!/bin/bash
error=""
function validation {
if [ -d "./DataBases" ]
then
error="0"
else
error="1"
echo "Error! DataBases file not exist ❌"
fi
if [ ! -d "./DataBases/" -a $error = 0 ]
then
error="1"
echo "Error! There's no DBs yet ❌"
else
error="0"
fi
}
# call validation function
validation
if [ $error -eq 0 ]
then
# 3 - display only directories.
cd ./DataBases
ls -d */
else
echo "Can't complete this action ❌❌"
fi
Main_Menu.sh
#!/bin/bash
options=("Create Database" "List Databases" "Connect To Databases" "Drop Database" "Exit")
PS3="Enter choices from 1 to 5: "
while [[ "$choice" != "Exit" ]]
do
echo " "
select choice in "${options[@]}"
do
case $choice in
"Create Database" ) source ./Create_DB.sh
break
;;
"List Databases" ) source ./List_DB.sh
break
;;
"Connect To Databases" ) source ./Connect_DB.sh
break
;;
"Drop Database" ) source ./Drop_DB.sh
break
;;
"Exit" ) exit
break
;;
*) echo "Invalid input please try again later"
;;
esac
done
done
我认为文件需要执行权限,但我错了:
$ ls -l
-rwxrwxr-x. 1 aem aem 804 Apr 8 14:45 Drop_DB.sh
-rwxrwxr-x. 1 aem aem 696 Apr 8 14:41 Mainmenu.sh
错误如下:
./Mainmenu.sh: line25: ./Drop_DB.sh: No such file or directory
还,我试过了:"没有这样的文件或目录">
编辑:
我这里的问题是,我做了cd
在List_DB.sh
文件中列出所有的目录。所以,在执行List_DB.sh
之后,我的pwd
是DataBases/$DB_Name
目录,脚本位于另一个路径,即DataBases/$DB_Name
中的No such file or directory
。我通过在List_DB.sh
文件中添加cd ..
来返回主文件夹来解决这个问题。
几个问题/观察:
- 主脚本调用
List_DB.sh
,但这个文件不是在你的ls -l
输出,你的脚本位于不同的目录? - 由于您正在采购脚本文件,因此不需要'execute'权限
请牢记:
- 当脚本被执行时,子shell将被生成,子shell中的大多数操作(例如,变量赋值,
cd
操作)在脚本退出时"丢失"(在cd
的情况下,就好像cd
是"未完成",你被留在你开始的目录中) - 在源脚本的情况下,命令(在脚本中)在当前shell中执行,所以当脚本退出时,在shell中所做的任何更改(变量赋值,
cd
操作)都保留在主shell中(在cd
的情况下,您不会返回到您开始的地方)
我的猜测:最后一个成功来源的脚本(List_DB.sh
?)执行操作(例如,cd
),使父脚本位于不同的目录中,因此出现错误消息。