cd没有用引号在脚本中工作

时间:2018-04-15 10:16:54

标签: linux bash shell unix terminal

我遇到了一个奇怪的问题。如果我输入终端cd "folder"(带有文件夹名称旁边的引号),它就能正常工作。

但是如果我在我的bash脚本中使用下面的代码,它会给我一个错误,说该文件夹不存在。

path="\"folder\""
echo $path   ---> outputs "folder", with quotes
cd $path

当我在终端中编写cd "folder"并且运行下面的脚本时,我位于同一个文件夹中。

有什么问题?

编辑:让自己清楚。我需要在文件夹名称周围使用引号,因为某些文件夹包含空格。

3 个答案:

答案 0 :(得分:0)

shell将扩展参数一次。使用#include <stdlib.h> #include <stdio.h> #include <string.h> #define LINE_LEN (1024) int main(void) { int action = 0; char input[LINE_LEN] = {0}; size_t len = 0; printf("enter decision: "); { int c = fgetc(stdin); /* equivalent to getchar() */ if (EOF == c) { putc('\n'); if (ferror(stdin)) { perror("fgetc(stdin) failed"); } else { fprintf(stderr, "read EOF, aborting ...\n"); } exit(EXIT_FAILURE); } action = c; } /* read left over from previous input: */ { int c = fgetc(stdin); if (EOF == c) { putc('\n'); if (ferror(stdin)) { perror("fgetc(stdin) failed"); exit(EXIT_FAILURE); } } else if ('\n' != c) { fprintf(stderr, "read unexpected input (%d), aborting ...\n", c); exit(EXIT_FAILURE); } } len = strlen(input); if (LINE_LEN <= len + 1) { fprintf(stderr, "input buffer full, aborting ...\n"); exit(EXIT_FAILURE); } switch(action - '0') { case 1: printf("enter file name: "); if (NULL == fgets(input + len, LINE_LEN - len, stdin)) { putc('\n'); if (ferror(stdin)) { perror("fgets() failed"); } else { fprintf(stderr, "missing input, aborting ...\n"); } exit(EXIT_FAILURE); } (input + len)[strcspn(input + len, "\n")] = '\0'; /* cut off new-line, if any. */ printf("read file name '%s'\n", input + len); break; default: fprintf(stderr, "unknown action (%d), aborting ...\n", action); exit(EXIT_FAILURE); break; } } 时,会在执行cd "folder"之前删除引号。精细。
使用cd,shell会在带引号的字符串中翻译cd $path$path尝试在名称中找到带引号的目录。

答案 1 :(得分:0)

您需要输入如下所示的引号: -

.intel_syntax noprefix
.section .text
.global _start

_start:
push    4
pop     rax             
xor     ebx,ebx
inc     ebx                 # ebx = 1 = stdout            
mov     DWORD PTR [rsp-0x4],0x646c72
mov     DWORD PTR [rsp-0x8],0x6f57206f
mov     DWORD PTR [rsp-0xc],0x6c6c6548
sub rsp, 0xc
xor     rcx,rcx
mov rcx, rsp
push    11
pop     rdx             
int     0x80
xor     eax,eax
inc     eax             
xor     ebx,ebx         
int     0x80

答案 2 :(得分:0)

您试图转到'folder'而不是"folder",而不是说您尝试访问folder而不是folder。我想你想访问cd "folder"

引用是定义一个字符串,在你的情况下,你不需要它在字符串内容中。 当您编写folder时,您定义了一个包含cd "$path"

的字符串

您必须重新修改数据来源,以删除不需要的报价。

与@Abhijit一样,Pritam回答说,如果你有空间或角色可以被shell解释,你可以用双引号括起你的变量:path="folder with space" echo -n $path ---> outputs folder with space cd "$path" 。正如manual

中所述
  

用双引号括起字符('&#34;')会保留引号内所有字符的字面值,但'$','`','\'以及启用历史记录扩展时除外,'!'。

     

[...]字符'$'和'`'在双引号中保留其特殊含义

所以代码,从数据源中删除了双引号:

{{1}}

我建议您在文件夹名称中没有空格,这样可以防止出现空间问题。