Сценарий bash для cd в каталог

По существу, вы хотите повторить каждую строку четыре раза с разными суффиксами после второго поля?

sed 'p;s/,/_1,/2p;s/_1/_2/p;s/_2/_3/' file

Это p для печати строки как есть; первая команда s добавляет _1 перед второй запятой и печатает; вторая и третья s заменяется на _2 и _3, вторая носит флаг p для печати строки, а последняя версия печатается по умолчанию.

Изменить после расширенного вопроса

Если вы хотите зациклить заданное количество итераций, вы можете сделать

sed 'p;s/,/_1,/2p;G;s/$/0123456789+/;:a
s/\(_[0-9]*\)\([0-9]\)\(,.*\n.*\2\)\(.\)/\1\4\3\4/
s/_+/_10/;s/\(_[0-9]*\)\([0-9]\)+\(.*\n.*\2\)\(.\)/\1\40\3\2\4/
/_+/!P
/_123,/! ta
d' file

, где 123 в предпоследней строке — максимальный индекс. В данный момент у меня нет времени объяснять, но я могу сделать это позже, если вы хотите понять, что происходит.

0
30.12.2016, 02:00
3 ответа

Есть два момента:

  • Проблемы с раскрытием тильды
  • Проблемы с поиском или выполнением.

Что касается тильды, очень недавний вопрос суперпользователя касался той же проблемы ( https://superuser.com/questions/1161493/why-bash-script-wont-extend-bashrc/1161496#1161496 )

Тильда раскрывается перед переменной, поэтому компакт-диск не может найти путь. Чтобы преодолеть это, введите команду с eval как таковую:

eval cd "${APPLICATION_PATH}"

К сожалению, когда вы выполняете сценарий (я имею в виду, что если он изменен на "+ x", вызывая путь), вы увидит, что $ PWD не изменяется в «текущей оболочке». Однако, если вы добавите такую ​​строку в конец сценария

ls

, вы увидите, что ls выполняется в новом рабочем каталоге.Почему?

Ответ здесь ( https://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a- bash-scrip # 176788 )

Краткий ответ: поиск будет запускать команды в текущем процессе оболочки . выполнение запустит команды в новом процессе оболочки. все еще в замешательстве? тогда, пожалуйста, продолжайте читать длинный ответ.

Вкратце, чтобы изменить $ PWD в текущей оболочке, вы должны «исходить» скрипт как таковой:

source /path/to/script

или

. /path/to/script

Третий момент: если вы не хотите связываться с исходным кодом или . , вы можете определить псевдоним в своем ~ / .bashrc ( https://stackoverflow.com/questions/752525/run-bash-script-as-source-without-source-command ) :

псевдоним mycmd = "source mycmd.sh"

6
28.01.2020, 02:15

Не вставляйте ~ внутри ""

#!/usr/bin/env bash
set -e
read name
APPLICATION_PATH=~/Documents/meteor/apps/$name
cd "${APPLICATION_PATH}"
pwd
0
28.01.2020, 02:15

вы можете использовать тильду '~', вам просто нужно включить правильный ключ расширения bash

set -x

или использовать полный путь '/ Volumes / Swap /Apps/...'

используйте bashrc для установки ярлыков env, таких как

export LocalApps=/Users/me/Applications
export SysApps=/Applications

, я бы не использовал eval

, если вы просто хотите втягивать строку из командной строки, вам не нужно использовать чтение просто возьмите arg

if [[ $# -eq 1 ]]; then
    #check if it's directory
    if [[ -d $name ]] ; then
      #do stuff here
    else
      echo 'bomb'
    fi
else
  usage
fi

вместо 'cd-ing' в каталог, узнайте, как использовать ~ +, ~ -, pushd и popd, много раз вам не нужно фактически 'cd' в каталог

вы можете сделать что-нибудь это

pushd $SysApps/$name
  do stuff 
popd
1
28.01.2020, 02:15

Теги

Похожие вопросы