В чем разница между простой строкой и строкой из переменной

#shell #eslint

#оболочка #eslint

Вопрос:

Я пытаюсь написать простой shell скрипт, который будет запускать linter для многих файлов. Я сохранил все имена своих файлов в одной длинной строке, а затем также удалил /n из нее все потенциальные знаки. Затем я запускаю linter с жестко запрограммированным именем этих файлов и беру из переменной. Для жестко запрограммированных путей мой линтер работает и может найти эти файлы, но для пути к этим файлам, хранящимся в переменной, он не может.

Вот что я попробовал:

 #!/bin/sh
all_files_to_commit=$(git diff --name-only --cached)
ends_with_ts=".*.ts$"
ends_with_scss=".*.scss$"
all_ts_files=""
all_scss_files=""
for file in $all_files_to_commit
do
  if echo "$file" | grep "$ends_with_ts"; then
    all_ts_files="${all_ts_files}${file} "
  fi
  if echo "$file" | grep "$ends_with_scss"; then
    all_scss_files="${all_scss_files}${file} "
  fi
done
all_ts_files=$(echo "$all_ts_files" | tr -d "n")
echo "All files in one string"
echo "$all_ts_files"
./node_modules/.bin/eslint src/components/List/List.ts src/views/Calculator/Calculator.ts --quiet
./node_modules/.bin/eslint "$all_ts_files" --quiet
  

Есть ли у вас какие-либо идеи, почему эти пути могут отличаться и как я могу это исправить?

Я также попробовал этот скрипт без строки, который удаляет n знаки

Вывод:

 All files in one string
src/components/List/List.ts src/views/Calculator/Calculator.ts 

/home/kaczor6418/Desktop/projects/expressions-calculator/src/components/List/List.ts
  24:9  error  Delete `·············`  prettier/prettier

/home/kaczor6418/Desktop/projects/expressions-calculator/src/views/Calculator/Calculator.ts
  53:9  error  Unexpected var, use let or const instead  no-var
  54:9  error  Delete `············`                     prettier/prettier

✖ 3 problems (3 errors, 0 warnings)
  3 errors and 0 warnings potentially fixable with the `--fix` option.


Oops! Something went wrong! :(

ESLint: 7.11.0

No files matching the pattern "src/components/List/List.ts src/views/Calculator/Calculator.ts " were found.
Please check for typing mistakes in the pattern.
  

Ответ №1:

С кавычками в

 ./node_modules/.bin/eslint "$all_ts_files" --quiet
  

найденные имена файлов объединяются в одно имя файла с пробелами.
Строка src/components/List/List.ts src/views/Calculator/Calculator.ts не представляет файл (у вас нет каталога с именем List.ts src ).
С заданными именами файлов вы можете удалить кавычки:

 ./node_modules/.bin/eslint $all_ts_files --quiet
  

Когда вы создаете строку из списка имен файлов, вы не можете видеть, когда пробел (или перевод строки) является частью имени файла.
В вашем примере вы могли бы попробовать использовать массивы:

 all_files_to_commit=($(git diff --name-only --cached))
# change code here when you want to use arrays
./node_modules/.bin/eslint ${all_ts_files[@]} --quiet
  

или используйте что-то вроде

 ./node_modules/.bin/eslint $(git diff --name-only --cached | grep ts$) --quiet
  

Вы можете поддерживать пробелы в именах файлов (не в новых строках) с помощью

 ./node_modules/.bin/eslint $(git diff --name-only --cached | sed -n '/ts$/ s/.*/"amp;"/p' ) --quiet