комнате не удается удалить файлы подстановочным знаком из сценария, но работами от приглашения оболочки

Вы можете использовать values() конструкцию & amp; сделайте left join:

select tt.empid, isnull(t.No_of_days, 0)
from ( values (3), (4), (5) 
     ) tt (empid) left join
     table t
     on t.empid = tt.empid;

РЕДАКТИРОВАТЬ: Если у вас больше идентификатора employee, то вы должны иметь один промежуточный стол и усилитель; делать left join:

select tt.empid,
       ISNULL(t.No_of_days, 0)
from table tt left join -- possible employee id table
     [_table] t
     on t.empid = tt.empid;
54
задан Jonathan Leffler 26 April 2009 в 03:05
поделиться

4 ответа

TL; DR

Заключать в кавычки только переменную, а не весь ожидаемый путь с подстановочным знаком

rm "$archivedir"/*.bz2

Объяснение

  • В Unix программы, как правило, не интерпретируют подстановочные знаки сами. Оболочка интерпретирует подстановочные знаки без кавычек и заменяет каждый аргумент с подстановочными знаками списком совпадающих имен файлов. если $ archivedir может содержать пробелы, то rm $ archivedir / *. bz2 может не выполнять то, что вы

  • Вы можете отключить этот процесс, заключая в кавычки символ подстановки, используя двойные или одинарные кавычки или обратную косую черту перед Это. Однако здесь это не то, что вам нужно - вы хотите, чтобы подстановочный знак был расширен до списка файлов, которые ему соответствуют.

  • Будьте осторожны при написании rm $ archivedir / *. Bz2 (без кавычек). Разделение слов (то есть разбиение командной строки на аргументы) происходит после замены $ archivedir. Поэтому, если $ archivedir содержит пробелы, вы получите дополнительные аргументы, которые вы не намеревались. Скажем, archivedir - это / var / архивы / ежемесячно / с апреля по июнь . Тогда вы получите эквивалент написания rm / var / archives / month / April / June / *. Bz2 , который пытается удалить файлы "/ var / archives / month / April", "to" и все файлы, соответствующие "June / *. bz2", что не то, что вам нужно.

Правильное решение - написать :

rm "$archivedir"/*.bz2
104
ответ дан 7 November 2019 в 07:49
поделиться

Ваша исходная строка

rm "$archivedir/*.bz2"

может быть переписана как

rm "$archivedir"/*.bz2

для достижения того же эффекта. Расширение подстановочного знака не выполняется должным образом в вашей существующей установке. Сдвигая двойную кавычку в начало пути к файлу (что является допустимым), вы избегаете этого.

10
ответ дан 7 November 2019 в 07:49
поделиться

Просто, чтобы немного расширить это, bash имеет довольно сложные правила для работы с метасимволами в кавычках. В общем

  • почти ничего не интерпретируется в одинарных кавычках:

      echo '$ foo / *. C' => $ foo / *. C
     echo '\\ *' => \\ *
    
  • замена оболочки выполняется внутри двойных кавычек, но метасимволы файлов не раскрываются:

      FOO = hello; echo "$ foo / *. c" => привет / *. c
    
  • все внутри обратных кавычек передается в подоболочку, которая их интерпретирует. Переменная оболочки, которая не экспортируется, не определяется в подоболочке. Итак, первая команда эхом пуста, а вторая и третья эхом "пока":

     BAR = пока эхо `echo $ BAR`
    Bar = свидания; echo `echo $ BAR`
    экспорт BAR = пока; echo `echo $ BAR`
    

(И заставить его напечатать так, как вы хотите в SO , нужно несколько попыток , по-видимому, невозможно ...)

9
ответ дан 7 November 2019 в 07:49
поделиться

Кавычки приводят к тому, что строка интерпретируется как строковый литерал, попробуйте удалить их.

4
ответ дан 7 November 2019 в 07:49
поделиться