отслеживание движущегося сценария оболочки - PullRequest
2 голосов
/ 28 сентября 2011

Я надеюсь, что кто-нибудь может мне помочь.В течение последнего месяца я изучал Bash ... У меня есть программа (простая программа изучения языка), которую я хочу установить и запустить из скрипта.

У меня есть скрипт, который создаст новую папку и переместится в нее.То, как я это делаю в данный момент, ниже, хотя у меня были проблемы с массивами, которые я использую позже.Мне было интересно, если есть более чистый способ получить новый путь к имени файла.Буду признателен за любую помощь или понимание.

#!/bin/bash

echo "# path to me --------------->  ${0}     "
echo "# parent path -------------->  ${0%/*}  "
echo "# my name ------------------>  ${0##*/} "

if [[ ! -d ${0%/*}/SomeNewFolder ]] && [[ ! -d ${0%/*}/../SomeNewFolder ]]
then
    mkdir ${0%/*}/SomeNewFolder
    mv ${0} ${0%/*}/SomeNewFolder/${0##*/}
fi

echo ${0%/*}
newpath=$(echo "${0%/*}/SomeNewFolder")
echo $newpath

Всего наилучшего, Бен
выход

Ответы [ 4 ]

2 голосов
/ 28 сентября 2011

Для ясности, я бы, вероятно, объявил именованные переменные для ваших общих значений вместо постоянного повторного использования массива $ {0}.Также полезно заключать в кавычки переменные и строки.

Единственная серьезная проблема, с которой я столкнулся, - это запуск ./script.sh, при котором $ 0 будет равно только имени файла, поэтому я добавляю «./» в началедело.

#!/bin/bash -u

ME="${0}"
if [[ ! "$ME" =~ /^\// ]]; then
        ME="./$ME"
fi
PARENT="${ME%/*}"
FILENAME="${ME##*/}"
FOLDER="SomeNewFolder"
NEW="$PARENT/$FOLDER"

if [[ ! -d "$NEW" ]] && [[ "${PARENT%/*}" != "$FOLDER" ]]; then
        mkdir "$NEW"
        mv "$ME" "$NEW"
fi

echo "$PARENT"
echo "$NEW"
0 голосов
/ 28 сентября 2011
me="$0"
newdir=SomeNewFolder

if [[ $me =~ ^/ ]] ; then
    full_path="$me"
else
    full_path="$PWD/$me"
fi
full_path="${full_path//\/\.\///}" # prettify

path_to_me="${full_path%/*}"
parent_dir="${path_to_me##*/}"

if [ ! "$parent_dir" = "$newdir" ] ; then
    mkdir -p "$path_to_me/$newdir"
    mv -f "$full_path" "$path_to_me/$newdir/"
fi

В основном похоже на то, что делал lunixbochs, но с небольшими изменениями

  1. имена переменных в нижнем регистре, чтобы не путать с переменными среды
  2. грубые оценкиабсолютный путь
  3. -f и -p, потому что интерактивность никогда не бывает крутой, а почему бы и нет
0 голосов
/ 28 сентября 2011

Установка и настройка программ более уместна из файла make. Конечно, поначалу это кажется пугающим, но основы, такие как то, что вы хотите, довольно просты. Для вашего проекта в идеале вы должны иметь три элемента:

  1. ваша программа
  2. ваш скрипт запуска
  3. ваш make-файл, т.е. ваш установщик

Это разбивает каждый из этих различных компонентов, облегчая управление каждым из них. Если вы соберете их вместе, вы можете переместить файл tar на новый компьютер и переустановить без каких-либо изменений. Bash - замечательный инструмент, но не установщик.

Пример скрипта make ниже:

.PHONY: all clean
SCRIPT=yourScriptName.sh
SUBFOLDER=someFolder

all: $(SCRIPT)

$(SCRIPT): $(SUBFOLDER)
    cp $(SCRIPT) $(SUBFOLDER)    
$(SUBFOLDER): 
    mkdir $(SUBFOLDER)
clean:
    -rm -f $(SUBFOLDER)/$(SCRIPT)
    -rmdir $(SUBFOLDER)

ВАЖНО! make чувствителен к пробелам! Эти отступы - табуляция , а не четыре пробела.

0 голосов
/ 28 сентября 2011

Ну, вы можете сделать что-то вроде этого, чтобы получить абсолютный путь:

PARENTPATH=$( cd "$( dirname "$0" )" && pwd )
NEWPATH=${PARENTPATH}/SomeNewFolder
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...