TU *_* HU 2 shell shell-script
在我的 Linux 机器上,我想删除包含我存储在参数 ($LIB_TO_REMOVE) 中的特定单词的目录。但是,当我使用通配符和参数扩展(首先ls检查)时,shell 不会解释*为通配符。有什么建议?我期待ls *${LIB_TO_REMOVE}*列出前 3 个目录。
$ ls
NG-23827_01_AD_02_BI_LS_01_F4_lib390563_6741_1_quant
NG-23827_01_AD_04_BI_LS_01_A7_lib390582_6741_1_quant
NG-23827_01_AD_04_BI_NL_02_B7_lib390583_6737_1_quant
NG-23827_01_AD_05_BI_LS_01_A11_lib390614_6741_2_quant
NG-23827_01_AD_05_BI_LS_02_A8_lib390590_6741_1_quant
NG-23827_01_AD_05_BI_NL_01_C9_lib390600_6741_1_quant
NG-23827_01_AD_06_BI_NL_02_E3_lib390554_6741_1_quant
NG-23827_01_AD_07_BI_LS_02_G5_lib390572_6741_1_quant
NG-23827_01_AD_07_BI_NL_02_F1_lib390539_6751_1_quant
NG-23827_01_AD_08_BI_LS_02_G8_lib390596_6741_1_quant
Run Code Online (Sandbox Code Playgroud)
$ echo $LIB_TO_REMOVE
lib390563 lib390582 lib390583
Run Code Online (Sandbox Code Playgroud)
$ ls *${LIB_TO_REMOVE}*
ls: cannot access *lib390563: No such file or directory
ls: cannot access lib390582: No such file or directory
ls: cannot access lib390583*: No such file or directory
Run Code Online (Sandbox Code Playgroud)
您的变量是单个字符串:lib390563 lib390582 lib390583. 因此,假设(根据您显示的错误消息)默认的空格分词*${LIB_TO_REMOVE}*意味着“名称以字符串结尾lib390563或完全等于lib390582或以字符串开头的所有文件或目录lib390583”。由于您没有名称与这些条件匹配的文件或目录,因此不会显示任何内容。以下是几种可能的解决方法:
由于您大概控制了变量的内容,因此您可以安全地执行以下操作:
$ for i in $LIB_TO_REMOVE; do ls -d *"$i"*; done
NG-23827_01_AD_02_BI_LS_01_F4_lib390563_6741_1_quant
NG-23827_01_AD_04_BI_LS_01_A7_lib390582_6741_1_quant
NG-23827_01_AD_04_BI_NL_02_B7_lib390583_6737_1_quant
Run Code Online (Sandbox Code Playgroud)
但请注意有关使用不带引号的变量的一般问题。
对变量使用数组而不是字符串:
$ LIB_TO_REMOVE=(lib390563 lib390582 lib390583)
$ for i in "${LIB_TO_REMOVE[@]}"; do ls -d *"$i"*; done
NG-23827_01_AD_02_BI_LS_01_F4_lib390563_6741_1_quant
NG-23827_01_AD_04_BI_LS_01_A7_lib390582_6741_1_quant
NG-23827_01_AD_04_BI_NL_02_B7_lib390583_6737_1_quant
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |