通配符和参数扩展一起使用

通配符和参数扩展一起使用

在我的 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
$ echo $LIB_TO_REMOVE 
lib390563 lib390582 lib390583
$ 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

答案1

您的变量是单个字符串:lib390563 lib390582 lib390583。因此,假设(根据您显示的错误消息)在空格上的默认分词*${LIB_TO_REMOVE}*意味着“名称以字符串结尾lib390563或完全等于lib390582或以字符串开头的所有文件或目录lib390583”。由于您没有名称与这些条件匹配的文件或目录,因此不会显示任何内容。以下是一些可能的解决方法:

  1. 由于您可能控制变量的内容,因此您可以安全地执行此操作:

    $ 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
    

    但请注意一般问题关于使用不带引号的变量。

  2. 使用数组而不是字符串作为变量:

    $ 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
    

相关内容