this
полезен в шаблоне построителя.
public class User {
private String firstName;
private String surname;
public User(Builder builder){
firstName = builder.firstName;
surname = builder.surname;
}
public String getFirstName(){
return firstName;
}
public String getSurname(){
return surname;
}
public static class Builder {
private String firstName;
private String surname;
public Builder setFirstName(String firstName) {
this.firstName = firstName;
return this;
}
public Builder setSurname(String surname) {
this.surname = surname;
return this;
}
public User build(){
return new User(this);
}
}
public static void main(String[] args) {
User.Builder builder = new User.Builder();
User user = builder.setFirstName("John").setSurname("Doe").build();
}
}
me=`basename "$0"`
Для прочтения symlink1, который обычно является не, что Вы хотите (Вы обычно не хотите смущать пользователя этот путь), попробуйте:
me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"
IMO, это произведет запутывающий вывод. "Я выполнил foo.sh, но он говорит, что я выполняю bar.sh!? Должна быть ошибка!" Кроме того, одна из целей того, что по-другому назвала символьные ссылки состоит в том, чтобы обеспечить другую функциональность на основе имени, которым это называют как (думайте gzip и gunzip на некоторых платформах).
1 таким образом, для разрешения символьных ссылок, таким образом это, когда пользователь выполняется foo.sh
который является на самом деле символьной ссылкой на bar.sh
, Вы хотите использовать разрешенное имя bar.sh
вместо foo.sh
.
Можно использовать 0$ для определения названия сценария (с полным путем) - для получения названия сценария только можно обрезать ту переменную с
basename $0
Для ответа на Chris Conway на Linux (по крайней мере), Вы сделали бы это:
echo $(basename $(readlink -nf $0))
readlink распечатывает значение символьной ссылки. Если это не символьная ссылка, это печатает имя файла.-n говорит этому не печатать новую строку.-f говорит этому переходить по ссылке полностью (если бы символьная ссылка была ссылкой на другую ссылку, то это разрешило бы что один также).
$0
не отвечает на вопрос (насколько я понимаю). Демонстрация:
$ cat script.sh #! /bin/sh echo `basename $0` $ ./script.sh script.sh $ ln script.sh linktoscript $ ./linktoscript linktoscript
Как каждый добирается ./linktoscript
распечатать script.sh
?
[РЕДАКТИРОВАНИЕ] На @ephemient в комментариях выше, хотя вещь символьной ссылки может казаться изобретенной, возможно играть с $0
таким образом, что это не представляет ресурс файловой системы. OP немного неоднозначен о том, что он хотел.
Если бы Вы хотите его без пути тогда, Вы использовали бы ${0##*/}
Если название сценария имеет пробелы в нем, более устойчивый путь состоит в том, чтобы использовать "$0"
или "$(basename "$0")"
- или на MacOS: "$(basename \"$0\")"
. Это препятствует имени то, чтобы быть искаженным или интерпретируемый всегда. В целом это - хорошая практика к всегда именам переменной двойной кавычки в оболочке.
Эти ответы корректны для спорных вопросов, которые они формулируют, но существует тихое проблема при выполнении сценария из другого сценария с помощью 'исходного' ключевого слова (так, чтобы это работало в той же оболочке). В этом случае Вы получаете 0$ сценария выполнения вызова. И в этом случае, я не думаю, что возможно получить название самого сценария.
Это - пограничный случай и не должно быть отнесено СЛИШКОМ серьезно. При выполнении сценария из другого сценария непосредственно (без 'источника') использование 0$ будет работать.
С ударом> = 3 следующие работы:
$ ./s
0 is: ./s
BASH_SOURCE is: ./s
$ . ./s
0 is: bash
BASH_SOURCE is: ./s
$ cat s
#!/bin/bash
printf '$0 is: %s\n$BASH_SOURCE is: %s\n' "$0" "$BASH_SOURCE"
Короткий, ясный и простой, в my_script.sh
#!/bin/bash
running_file_name=$(basename "[110]")
echo "You are running '$running_file_name' file."
помещенный:
./my_script.sh
You are running 'my_script.sh' file.
# ------------- SCRIPT ------------- #
#!/bin/bash
echo
echo "# arguments called with ----> ${@} "
echo "# \$1 ----------------------> $1 "
echo "# \$2 ----------------------> $2 "
echo "# path to me ---------------> ${0} "
echo "# parent path --------------> ${0%/*} "
echo "# my name ------------------> ${0##*/} "
echo
exit
# ------------- CALLED ------------- #
# Notice on the next line, the first argument is called within double,
# and single quotes, since it contains two words
$ /misc/shell_scripts/check_root/show_parms.sh "'hello there'" "'william'"
# ------------- RESULTS ------------- #
# arguments called with ---> 'hello there' 'william'
# $1 ----------------------> 'hello there'
# $2 ----------------------> 'william'
# path to me --------------> /misc/shell_scripts/check_root/show_parms.sh
# parent path -------------> /misc/shell_scripts/check_root
# my name -----------------> show_parms.sh
# ------------- END ------------- #