Bash 如果目录存在且字符串有“匹配”\&引用;在while循环中使用&&&引用;及||&引用;在狂欢节上

Bash 如果目录存在且字符串有“匹配”\&引用;在while循环中使用&&&引用;及||&引用;在狂欢节上,bash,while-loop,Bash,While Loop,我试图从用户处获取输入,并检查该目录是否存在,以及在while语句中是否包含“/”,但我不确定正确的语法是什么: while [[ ! -d ${GATHER_DIRPATH}/${STREAM_NAME} && "$STREAM_NAME" != *\/* ]] || [ -z ${STREAM_NAME} ]; 当我以“Folder1/Folder2”的形式输入时,它应该检查此目录是否存在,还应该检查字符串中是否有“/” [[ -d ${GATHER_DIRPATH}/$

我试图从用户处获取输入,并检查该目录是否存在,以及在while语句中是否包含
“/”
,但我不确定正确的语法是什么:

while [[ ! -d ${GATHER_DIRPATH}/${STREAM_NAME} && "$STREAM_NAME" !=
 *\/* ]] || [ -z ${STREAM_NAME} ];
当我以
“Folder1/Folder2”
的形式输入时,它应该检查此目录是否存在,还应该检查字符串中是否有
“/”

[[ -d ${GATHER_DIRPATH}/${STREAM_NAME} && "$STREAM_NAME" = */* ]]
我需要用&&条件否定条件 这是有效的: [[!-d${GATHER_DIRPATH}/${STREAM_NAME}| |“$STREAM_NAME”!=/]

这不起作用(我需要这个来起作用): [[!-d${GATHER\u DIRPATH}/${STREAM\u NAME}&“$STREAM\u NAME”!=/]] 第一个示例运行良好,但当我使用&&而不是| |时,条件的计算结果不正确。 我的条件只应在以下情况下进入WHILE循环(这两个条件都满足): 条件A)目录不存在 及 条件B)流名称不包含/(正斜杠)运算符。(我必须使用此条件,因为传递的流_名称将始终包含两个文件夹,例如:folderA/folderB。这就是为什么我必须检查正斜杠包含,以确保用户输入的两个文件夹准确无误)
(如果您对条件B有更好的方法,请让我知道)

检查此目录是否存在,并检查字符串中是否有“/”

[[ -d ${GATHER_DIRPATH}/${STREAM_NAME} && "$STREAM_NAME" = */* ]]
要否定该条件,请执行以下操作:

[[ ! -d ${GATHER_DIRPATH}/${STREAM_NAME} || "$STREAM_NAME" != */* ]]

要测试一个变量是否包含给定的子字符串,一个常见的模式是测试删除该子字符串是否会更改值。如果未找到,则值将相同:

test "$STREAM_NAME" = "${STREAM_NAME#*/}"
在这里,我们删除第一个
/
之前的所有内容-如果没有
/
,则字符串将比较相等。我们本可以使用Bash特有的
“${STREAM\u NAME/\/}”
,但为什么不编写可移植代码呢

我们可以将其与现有目录的测试结合起来(您可能还希望测试它是否可写);我们首先进行字符串测试,以避免在已经失败的情况下等待磁盘I/O:

while test "$STREAM_NAME" = "${STREAM_NAME#*/}" \
   || ! test -d "${GATHER_DIRPATH}/${STREAM_NAME}" \
   || ! test -w "${GATHER_DIRPATH}/${STREAM_NAME}"
do read -p "directory name: " STREAM_NAME
done

您应该添加当前输出和预期输出。感谢您的回复,非常感谢。然而,我需要否定这个条件,但是使用&&condition你的例子:[!-d${GATHER\u DIRPATH}/${STREAM\u NAME}|“$STREAM\u NAME”!=/]]我需要的是:[!-d${GATHER\u DIRPATH}/${STREAM NAME}&“$STREAM NAME”!=/]]你的例子运行得很好,但是当我使用&&而不是|时,条件的计算结果不正确。仅当(这两个条件都满足)条件A)目录存在且条件B)流名称包含/(正斜杠)运算符时,我的条件才应进入WHILE循环。(我必须使用此条件,因为传递的流_名称将始终包含2个文件夹,例如:folderA/folderB。这就是为什么我必须检查正斜杠包含,以确保用户输入的两个文件夹准确无误)(如果您对条件B有更好的方法,请让我知道)